如何将UTF-8解释为GB2312编码转换为真正的UTF-8编码?

时间:2013-10-05 00:33:46

标签: php encoding utf-8 character-encoding gb2312

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

问题

我使用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

1 个答案:

答案 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);

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