用PHP转换Microsoft Word特殊字符


Converting Microsoft Word special characters with PHP

我正在尝试转换包含MS Word省略号和长破折号的用户粘贴的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字符id号,我编写了一个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码。这样的:

回声stdump("GPUsa€¦");

生产:

U G (71) p(80)(85)(115)(226)€(128)¦(166)

希望对你有帮助。

——基思

它适合我:

$str=file_get_contents($file); 
$array=array("‘"=>"'","’"=>"'","”"=>'"',"“"=>'"',"–"=>"-","—"=>"-","–"=>"-","…"=>"...");
$str = strtr( $str,$array);
file_put_contents($file,$str);