1

我正在向第三方网站发出 cURL 请求,该网站返回一个文本文件,我需要在该文件上进行一些字符串替换,以将某些字符替换为它们的 html 实体等效项,例如我需要替换íí.

直接在响应上使用string_replace/preg_replace_callback不会导致匹配(无论是í直接搜索还是使用其十六进制代码\x00\xED),所以我utf8_encode()在执行替换之前使用了。但将所有字符utf8_encode替换为.íÃ

为什么会发生这种情况,使用 php 对任意一段文本执行 UTF-8 替换的正确方法是什么?

*编辑 - 一些进一步的研究表明

utf8_decode("í") == í;
utf8_encode("í") == í;
utf8_encode("\xc3\xad") ==  í;
4

2 回答 2

1

您可能通过 php 源代码中的字符串文字指定了要替换的字符/字符串?如果你这样做了,那么这些字符串文字的值取决于你保存 php 文件的编码。所以当你看到字符 í 时,也许文字值是拉丁编码的 í,比如 8859-1 编码,或者它的windows cp1252 í,或者它的 utf8 í,甚至 utf32 í ...我不知道其中有多少是不同的,但我知道至少有些有不同的字节表示,因此在 php 字符串比较中不会匹配.

我的意思是,您需要指定与传入文本的任何编码相匹配的正确字符。

这是一个不使用文字的例子

$iso8859_1 = chr(236);
$utf8 = utf8_encode(chr(236));

请注意,如果您决定将文件编码更改为 utf8,则在您更改编码时,文本编辑器可能会或可能不会转换现有字符。我见过编辑在更改编码时做了非常奇怪的事情。从一个新文件开始。

也 - 仅仅因为其他服务器声称它的 utf8,并不意味着它真的是。

于 2012-05-06T21:44:47.987 回答
1

utf8_encode 绝对不是这里的方式(如果你这样做,你就是双重编码)。

回覆。直接搜索字符或使用其十六进制代码,您是否确保在正则表达式的末尾添加 u 修饰符?例如/\x00\xED/u

于 2012-05-06T19:51:22.840 回答