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

时间:2012-05-06 19:00:37

标签: php utf-8 character-encoding

我正在向第三方网站发出cURL请求,该网站返回一个文本文件,我需要在其上执行一些字符串替换以通过其html实体等效替换某些字符,例如我需要替换í í

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

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

*编辑 - 进一步的研究显示

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

我的观点是,您需要指定正确的字符,该字符将匹配您的传入文本所处的编码。

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

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

警告,如果您决定将文件编码更改为utf8,则在更改编码时,文本编辑器可能会也可能不会转换现有字符。我已经看到编辑在改变编码时做了很奇怪的事情。从一个新文件开始。

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