如何正确地解码XML文件中的特殊字符?

4
在我解析一些 XML 文件(通常是 RSS)时,遇到了包含如 Today’s Newest 这样的字符的文本,但在从节点中提取文本后,它会变成 Today’s Newest。这告诉我我处理解码过程时存在错误。

我可以简单地 修补我的脚本 来修复这个 bug,但如果还有其他许多字符变成乱码怎么办呢?有没有正确的方法来处理 XML 文件,将其转换为 UTF-8 脚本而不损坏编码呢?

以下是我尝试过但似乎不太有效的一些方法:

$xml = file_get_contents($file);

// One: still contains ’
//$xml = @iconv('UTF-8', 'UTF-8//IGNORE', $xml);

// Two: LibXMLError Entity 'rsquo' not defined
//$xml = htmlentities($xml, null, 'UTF-8');
//$xml = htmlspecialchars_decode($xml, ENT_QUOTES);

// Three: still contains ’
//$xml = mb_convert_encoding($xml, "UTF-8", "UTF-8");

$xml = simplexml_load_string($xml, null, LIBXML_NOCDATA | LIBXML_NOENT);

1
请检查您输出内容的方式。如果输出目标不支持UTF-8,也可能会出现此问题。我假设您是将内容输出到浏览器,请检查浏览器编码,并尝试将其明确设置为UTF-8,因为您可能会从XML中获取正确的文本,但它显示错误。如果上述方法无效,请尝试使用DOMDocument加载XML。 - zysoft
请参考以下链接:http://stackoverflow.com/questions/9123370/special-characters-from-xml-file-dont-display-correctly-using-php - Abid Hussain
@zysoft,这解决了’问题!由于XML变得如此庞大,我停止使用CLI进行调试并转向浏览器。我简直不敢相信我忘记检查我的标头了!header('Content-Type: text/html; charset="UTF-8"'); - Xeoncross
@Xeoncross,我会将其作为答案发布。很高兴它对您有所帮助! - zysoft
2个回答

1

尝试一下这个:

$xml = simplexml_load_string($xml, null, LIBXML_NOCDATA | LIBXML_NOENT); $xml->addAttribute('encoding', 'UTF-8');


1

请检查您输出内容的方式。

如果输出目标不支持UTF-8,也可能会出现此问题。

我假设您是输出到浏览器,请检查浏览器编码,并尝试将其明确设置为UTF-8,因为您可能会从XML中获取正确的文本,但它显示错误。

如果上述方法无效,请尝试使用DOMDocument加载XML。


header('Content-Type: text/html; charset="UTF-8"'); - Xeoncross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接