2011-09-14 18 views
12

Tôi đang cố chuyển đổi văn bản Word được dán bởi người dùng có dấu ba chấm MS Word và dấu gạch ngang dài trước khi xử lý thêm.Chuyển đổi các ký tự đặc biệt của Microsoft Word bằng PHP

Tôi đã tìm thấy giải pháp được đề xuất cũ ở đây cho sự cố http://www.codingforums.com/archive/index.php/t-47163.html, nhưng nó không hoạt động đối với tôi. Sau khi thay thế dấu ba chấm, ví dụ, biến trở lại rỗng. Không bao giờ thấy bất cứ điều gì như thế này trước đây:

$src = "Long word dash – and weird Word ellipsis…"; 
$src = str_replace("‘", "'", $src); 
$src = str_replace("’", "'", $src); 
$src = str_replace("”", '"', $src); 
$src = str_replace("“", '"', $src); 
$src = str_replace("–", "-", $src); 
$src = str_replace("…", "...", $src); 
print $src; 

Bất kỳ ý tưởng nào?

+0

Xem câu trả lời của tôi trên ** [câu hỏi này] (http://stackoverflow.com/questions/6698785/modify-simplify-topic-title-for-displaying-in-url) **. Nó sẽ không bao gồm tất cả các kịch bản, nhưng nên xử lý các tình huống phổ biến nhất. – simshaun

+0

Tôi nhận ra rằng việc mã hóa tệp php của tôi là ANSI và mysql cũng có một số mã hóa chung không phải là utf8. Chỉnh sửa những chức năng này, chức năng của tôi và cả hai bên dưới đều hoạt động. Được nhiều người đánh giá cao. – giorgio79

Trả lời

30

Đối với bất cứ ai nhận được dấu hỏi kim cương trong PHP, phương pháp này thay thế tự UTF-8 làm việc tốt hơn so với sử dụng chức năng chr.

$search = [     // www.fileformat.info/info/unicode/<NUM>/ <NUM> = 2018 
       "\xC2\xAB",  // « (U+00AB) in UTF-8 
       "\xC2\xBB",  // » (U+00BB) in UTF-8 
       "\xE2\x80\x98", // ‘ (U+2018) in UTF-8 
       "\xE2\x80\x99", // ’ (U+2019) in UTF-8 
       "\xE2\x80\x9A", // ‚ (U+201A) in UTF-8 
       "\xE2\x80\x9B", // ‛ (U+201B) in UTF-8 
       "\xE2\x80\x9C", // “ (U+201C) in UTF-8 
       "\xE2\x80\x9D", // ” (U+201D) in UTF-8 
       "\xE2\x80\x9E", // „ (U+201E) in UTF-8 
       "\xE2\x80\x9F", // ‟ (U+201F) in UTF-8 
       "\xE2\x80\xB9", // ‹ (U+2039) in UTF-8 
       "\xE2\x80\xBA", // › (U+203A) in UTF-8 
       "\xE2\x80\x93", // – (U+2013) in UTF-8 
       "\xE2\x80\x94", // — (U+2014) in UTF-8 
       "\xE2\x80\xA6" // … (U+2026) in UTF-8 
    ]; 

    $replacements = [ 
       "<<", 
       ">>", 
       "'", 
       "'", 
       "'", 
       "'", 
       '"', 
       '"', 
       '"', 
       '"', 
       "<", 
       ">", 
       "-", 
       "-", 
       "..." 
    ]; 

    str_replace($search, $replacements, $string); 
+0

Dude, cảm ơn bạn. Tôi không biết điều gì đang xảy ra với bất kỳ thư viện phân tích cú pháp HTML nào nhưng tất cả đều có vẻ nhổ ra thay thế ký tự khó chịu ... Tôi nghĩ họ cho rằng bộ mã là ISO-8859-1 theo mặc định – Funktr0n

+0

Cảm ơn Verron! Chỉ cần nhận thấy url của fileformat là www.fileformat.info/info/unicode/char/ / – user697576

+0

Chúc mừng tôi có thể giúp! Không có giải pháp nào khác đang hoạt động% 100, vì vậy tôi nghĩ rằng tôi sẽ chia sẻ. –

8

Hmm. Tôi sử dụng chức năng này để khử trùng văn bản được sao chép vào RTE. Nó có thể hoặc có thể không hoạt động trong trường hợp này. Nó chuyển đổi thành các thực thể HTML, nhưng bạn có thể tinh chỉnh nó để chỉ chuyển đổi thành các ký tự thông thường:

function convertFromCP1252($string) 
{ 
    $search = array('&', 
        '<', 
        '>', 
        '"', 
        chr(212), 
        chr(213), 
        chr(210), 
        chr(211), 
        chr(209), 
        chr(208), 
        chr(201), 
        chr(145), 
        chr(146), 
        chr(147), 
        chr(148), 
        chr(151), 
        chr(150), 
        chr(133), 
        chr(194) 
       ); 

    $replace = array( '&amp;', 
         '&lt;', 
         '&gt;', 
         '&quot;', 
         '&#8216;', 
         '&#8217;', 
         '&#8220;', 
         '&#8221;', 
         '&#8211;', 
         '&#8212;', 
         '&#8230;', 
         '&#8216;', 
         '&#8217;', 
         '&#8220;', 
         '&#8221;', 
         '&#8211;', 
         '&#8212;', 
         '&#8230;', 
         '' 
        ); 

    return str_replace($search, $replace, $string); 
} 
5

Giải pháp tuyệt vời. Tôi đã sao chép và dán nó và nó đã làm việc với một vấn đề. Trong nghiên cứu tiếp theo, tôi đã thêm một vài ký tự không nằm trong mảng tìm kiếm và thay thế. Để tìm ra số ký tự ASCII id, tôi đã viết một hàm PHP trong đó cho thấy những gì mà số ký tự ASCII là:

function stdump($s){ 

    for($i=0;$i<strlen($s);$i++){ 

    echo substr($s,$i,1) . "(" . ord(substr($s,$i,1)) . ")"; 

    } 

    echo "<br/>"; 
} 

Nhân vật là hiển thị và bên cạnh nó số ascii là chương trình trong ngoặc đơn. Như thế này:

echo stdump ("GPUs" ¦ ");

sản xuất:

G (71) P (80) U (85) s (115) A (226) € (128) | (166)

Hope this helps.

--Keith