PHP和处理UTF-8 XML的外来字符

时间:2009-07-21 17:57:21

标签: php xml character-encoding

我正在从互联网上抓取一些数据并转换成xml文档。

  • 根据其meta标签
  • 删除的文件是utf-8

问题是一些数据包含外来字符,我找不到可靠地将它们转换成XML / utf-8友好实体的方法,以下错误是我通过阅读设法找到的,我会理想地喜欢一个可以一直工作的解决方案。

示例1正常工作,示例2失败。我的研究修复了示例1,但它似乎不是一个全面的解决方案。

Côte d'Ivoire  
Côte d'Ivoire (correct)  

我设法在我的xpath上使用以下函数正确解析 - ô - 解析。

$w->text(charset_decode_utf_8((string)$match->a));

function charset_decode_utf_8($string) {
    if(@!ereg("[\200-\237]",$string) && @!ereg("[\241-\377]",$string)) {
        return $string;
    }
$string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e","'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",$string);
$string = preg_replace("/([\300-\337])([\200-\277])/e","'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",$string);
return $string;
}
ÖFB Stiegl Cup  
ÖFB Stiegl Cup (wrong)  

不幸的是在 - Ö - 它被转换成双重实体。我不知道如何将其转换为适当的html实体。

我试过了:

  • 在创建我的xml文档时使用iso-8859-1编码
  • 使用带有utf-8编码的htmlentities

任何帮助都会非常感激,因为我正在试图让我的头发保存得正确。

2 个答案:

答案 0 :(得分:1)

UTF-8可用于存储任何字符(证据?它将它们存储在您正在抓取的网页中);那么,为什么要将一些编码为实体?

如果要打开XML文档并查看编码问题,请检查编辑器的参数:它是否尝试将文档分析为UTF-8? (默认情况下,某些编辑器不会 - 如果您使用浏览器在硬盘上打开文档,它可能无法将其识别为UTF-8,因为没有服务器发送任何标头,表明它是UTF-8)

如果问题不是这样,可以在某处上传有问题的XML文档示例吗?

答案 1 :(得分:-2)

不要打扰实体编码。改为使用CDATA块。

PHP不理解UTF-8。它认为这是一个字节流。最好这样对待它。你正在切换字节,你需要做的就是确保它们不被解析并且它们被正确标记。