这是一个奇怪的场景,而不是传统的将一种编码转换为另一种编码。
问题
我使用Readability API从给定网址检索主要内容,如果目标网址使用UTF-8编码,但目标网址采用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没有为目标网址的字符集提供参数(我将此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
答案 0 :(得分: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);
这会产生纳达尔绝境下大反击拒绝冷门逆转晋级中网四强
的预期输出。