1

这是一个奇怪的场景,而不是传统的将一种编码转换为另一种编码。

问题

我使用Readability API从给定的 url 检索主要内容,如果目标 url 用 UTF-8 编码,它工作正常,但是当目标 url 编码为GB2312(中文编码之一)时,我得到垃圾信息(中文字符是错误编码但英文字母和数字工作正常)。

深入研究

我检查了 HTTP 标头 Readability API 返回,它表明 API 响应的编码是UTF-8.

这是一段错误编码的汉字:

ÄÉ´ï¶û¾ø¾³Ï´󷴻÷¾Ü¾øÀäÃÅÄæת½ú¼¶ÖÐÍøËÄÇ¿

长度:42

原来是:

纳达尔绝境下大反击拒绝冷门逆转晋级中网四强

长度:21

但是,如果将正确的中文转换成unicode,应该是:

纳达尔绝境下大反击拒绝冷门逆转晋级中网四强

试过但不工作

iconv("GB2312", "UTF-8", $str);
iconv("GBK", "UTF-8", $str);
iconv("GB18300", "UTF-8", $str);
mb_convert_enconding($str, "UTF-8", "GB2312");
mb_convert_enconding($str, "UTF-8", "GB18300");
mb_convert_enconding($str, "UTF-8", "GBK");

请求的解决方案

由于 Readability API 没有为目标 url 的字符集提供参数(我将此 API 称为https://www.readability.com/api/content/v1/parser?url=http://sports.sina.com。 cn/t/2013-10-04/14596813815.shtml&token=my_token_here),我必须在处理 API 响应时进行转换。

如果您对此问题有任何想法,我将不胜感激。

环境信息:PHP 5.3.6

4

1 回答 1

4

似乎构成字符的各个字节已被编码为 HTML 数字实体,就好像它们是来自 ISO-8859-1 或其他一些 8 位编码的字符一样。要撤消数字实体编码,您可以使用 mb_decode_numericentity

$str = "ÄÉ´ï¶û¾ø¾³Ï´󷴻÷¾Ü¾øÀäÃÅÄæת½ú¼¶ÖÐÍøËÄÇ¿";

$str = mb_decode_numericentity($str, array(0, 255, 0, 255), "ISO-8859-1");

echo iconv("gb2312", "utf8", $str);

这会产生 的预期输出纳达尔绝境下大反击拒绝冷门逆转晋级中网四强

于 2013-10-05T09:01:33.567 回答