stri_replace弄乱了角色

时间:2009-06-28 20:34:09

标签: php email character-encoding

我使用此代码通过curl获取页面:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$message = curl_exec($ch);

curl_close($ch); 

我现在想要对$ message中的代码进行一些替换,但在此之前我将代码转储到文件中:

file_put_contents('debug_before_replace.txt',$message);

当我看一下这个文件时,所有文字似乎都很好,例如我在这里有标题:

<title>D.O.C.| Jantar Vínico Quinta do Portal | Quinta-feira, 25 de Junho 2009</title>

现在我做替换:

$ message = str_ireplace(array(
                            '身体GT;',                             '/体&GT;'                             )                         阵列(
                            $ fraseemcima,                             $ frasebaixo                             )                         $消息                 );

现在我将$ message转储到另一个文件:

file_put_contents('debug_after_replace.txt',$message);  

当我看一下这个文件时,我看到了这个:

<title>D.O.C.| Jantar Vínico Quinta do Portal | Quinta-feira, 25 de Junho 2009</title>

我在其余的代码中有各种混乱的字符。

任何人都明白为什么stri_replace搞砸了这个?我正在尝试发送一些邮件,这会弄乱一切。

注意:在替换中我确实有正文和/ body标签,但如果我添加&lt;所以会删除单词

编辑:我修好了!!

使用这条简单的线条,一切正常,外观看起来很棒:

$message = utf8_decode(curl_exec($ch));  

感谢macbirdie和S. Gehrig将我指向了正确的方向。 猜猜在字符集方面我还有一些学习要做的事情

再次感谢

2 个答案:

答案 0 :(得分:1)

您正在编辑的文本很可能是UTF-8或其他一些编码的多字节编码。 str_ireplace() 多字节安全,可在单字节上运行。这会导致您的多字节字符可能被破坏。 如果文档包含 B yte- O rder- M 方舟( BOM ),您还应检查 - 这也可能导致一些问题(根据this comment

答案 1 :(得分:1)

您必须使用多字节感知功能进行字符替换,例如mb_eregi_replace()

如果有,该文件也可能丢失unicode用来指示UTF-8扩展字符写入哪些endiannes的byte-order mark,因为它可能会丢失,因为替换函数可能会将其视为非文字,但这纯粹是猜测。