将 cURL 响应编码为 UTF-8 时出现奇怪的行为


Strange behaviour when encoding cURL response as UTF-8

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

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

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

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

utf8_decode("í") == í;
utf8_encode("í") == í;
utf8_encode("'xc3'xad") ==  í;

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

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

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

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

下面是一个不使用文字的示例

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

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

另外,仅仅因为其他服务器声称其UTF8,并不意味着它真的是。