Преобразование специальных символов Microsoft Word в PHP

Я пытаюсь преобразовать текст Word, вставленный пользователями, которые содержат эллипсис MS Word и длинную тире, прежде чем обрабатывать его дальше.

Я нашел здесь старое предлагаемое решение проблемы http://www.codingforums.com/archive/index.php/t-47163.html , но это не работает для меня. Например, после замены многоточия переменная возвращается как пустая. Никогда не видел ничего подобного раньше:

$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; 

Есть идеи?

    Для тех, кто получает знак вопроса о алмазе в PHP, этот метод замены символов UTF-8 работал лучше, чем использование функции 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); 

    Хм. Я использую эту функцию для дезинфекции текста, скопированного в RTE. В этом случае он может работать или не работать. Он преобразуется в объекты HTML, но вы можете настроить его, чтобы просто преобразовать в обычные символы:

     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); } 

    Отличное решение. Я скопировал и вставил его, и это сработало с проблемой. В ходе дальнейшего изучения я добавил несколько символов, которые не были найдены в массиве поиска и замены. Чтобы найти номера идентификаторов символов ASCII, я написал функцию PHP, которая показывает, что такое номер символа ASCII:

     function stdump($s){ for($i=0;$i<strlen($s);$i++){ echo substr($s,$i,1) . "(" . ord(substr($s,$i,1)) . ")"; } echo "<br/>"; } 

    Символ отображается, а рядом с ним число ascii отображается в скобках. Как это:

    echo stdump («GPUs»);

    производит:

    G (71) Р (80) и (85) с (115) A (226) € (128) | (166)

    Надеюсь это поможет.

    –Keith