【问题标题】:Strange behaviour when encoding cURL response as UTF-8将 cURL 响应编码为 UTF-8 时的奇怪行为
【发布时间】:2012-05-15 10:38:45
【问题描述】:

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

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

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

*编辑 - 一些进一步的研究揭示了

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

【问题讨论】:

  • 你确定文本不是utf-8吗?在编码运行后获得Ã 表明您现在正在对文本进行双重编码。
  • @Marc B 我不确定,因为它是我从中获取 cURL 响应的第三方网站,但是 taht 网站上的 html 页面明确指定了 UTF-8,所以我期望文本文件也会如此。我正在尝试 utf_encode 以响应原始 str_replace 不起作用,并且离弄清楚为什么会这样更近了。
  • 当然,您确定要输出到 utf-8 环境中吗?将 utf-8 文本转储到 iso8859 页面将产生相同的效果。

标签: php utf-8 character-encoding


【解决方案1】:

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

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

【讨论】:

  • 我不确定正则表达式中 utf8 的语法是什么,所以谢谢你......但它甚至不适用于 str_replace(使用来自这里的建议 stackoverflow.com/questions/3959626/replace-unicode-character
  • 好吧,你可以试试 preg_replace 吗?至于 str_replace - 也许您保存此代码的文件需要以某种编码或某种标记保存(如您链接到的答案中)。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 我稍后会对此进行测试,因为它看起来是一个不错的答案。然而,我确实发现我的问题过于复杂了。一个更好的解决方案是 utf8_encode 字符串,然后当在包含字符串的数组上调用 json_encode 时,它不再中断并且可以成功传递给我的 js 应用程序 - 无需进行任何替换。
猜你喜欢
  • 2019-05-21
  • 1970-01-01
  • 2011-08-08
  • 2011-04-08
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多