用PHP转换Microsoft Word特殊字符

用PHP转换Microsoft Word特殊字符,php,utf-8,character-encoding,ms-word,Php,Utf 8,Character Encoding,Ms Word,在进一步处理之前,我试图转换用户粘贴的包含MS Word省略号和长破折号的Word文本 我在这里找到了一个解决这个问题的老办法,但它对我不起作用。例如,替换省略号后,变量返回为空。以前从未见过这样的事情: $src = "Long word dash – and weird Word ellipsis…"; $src = str_replace("‘", "'", $src); $src = str_replace("’", "'", $src); $src = str_replace("”",

在进一步处理之前,我试图转换用户粘贴的包含MS Word省略号和长破折号的Word文本

我在这里找到了一个解决这个问题的老办法,但它对我不起作用。例如,替换省略号后,变量返回为空。以前从未见过这样的事情:

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

有什么想法吗?

嗯。我使用这个功能来清理复制到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);
}
函数convertFromCP1252($string)
{
$search=数组(“&”,
'',
'"',
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=数组(“&;”,
'',
'',
'"',
'‘',
'’',
'“',
'”',
'–',
'—',
'…',
'‘',
'’',
'“',
'”',
'–',
'—',
'…',
''
);
返回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/>";
}
函数stdump($s){

对于($i=0;$i任何在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);
$search=[//www.fileformat.info/info/unicode//=2018
UTF-8中的“\xC2\xAB”、//«(U+00AB)
UTF-8中的“\xC2\xBB”、/»(U+00BB)
UTF-8中的“\xE2\x80\x98”、/”(U+2018)
UTF-8中的“\xE2\x80\x99”、/”(U+2019)
UTF-8中的“\xE2\x80\x9A”/”(U+201A)
UTF-8中的“\xE2\x80\x9B”、/”(U+201B)
UTF-8中的“\xE2\x80\x9C”、/”(U+201C)
UTF-8中的“\xE2\x80\x9D”、/”(U+201D)
UTF-8中的“\xE2\x80\x9E”//(U+201E)
UTF-8中的“\xE2\x80\x9F”、/”(U+201F)
UTF-8中的“\xE2\x80\xB9”、/(U+2039)
UTF-8中的“\xE2\x80\xBA”、//›(U+203A)
UTF-8中的“\xE2\x80\x93”、//–(U+2013)
UTF-8中的“\xE2\x80\x94”、//-(U+2014)
UTF-8中的“\xE2\x80\xA6”//…(U+2026)
];
$replacements=[
"",
"'",
"'",
"'",
"'",
'"',
'"',
'"',
'"',
"",
"-",
"-",
"..."
];
str_replace($search,$replacements,$string);
这对我很有用:

$str=file_get_contents($file); 

$array=array("‘"=>"'","’"=>"'","”"=>'"',"“"=>'"',"–"=>"-","—"=>"-","–"=>"-","…"=>"...");

$str = strtr( $str,$array);

file_put_contents($file,$str);  

请参阅上的我的答案。它不会涵盖所有场景,但应该可以处理最常见的场景。我意识到我的php文件的编码是ANSI,mysql也有一些非utf8通用编码。更正这些,我的函数和下面的函数都可以工作。大家都非常感谢。老兄,谢谢。我不知道这些都是怎么回事HTML解析库,但它们似乎都会吐回讨厌的字符替换…我想他们认为默认情况下字符集是ISO-8859-1谢谢Verron!刚刚注意到fileformat url应该是www.fileformat.info/info/unicode/char//Happy我能帮上忙!其他解决方案都无法工作%100,所以我想我会分享。Verron Knowles的答案非常好,但缺少第二个数组的最后一个成员。此外,如果您使用的是PHP<5.4,则必须将数组形式转换为array()。如果您将Verron Knowles的Unicodes列表与此处的Unicodes列表相结合,则会得到一个非常完整的列表。谢谢!!