【问题标题】:PHP and dealing with foreign characters for UTF-8 XMLPHP 和处理 UTF-8 XML 的外来字符
【发布时间】:2009-07-21 17:57:20
【问题描述】:

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

  • 根据元标记,被抓取的文档是 utf-8

问题是某些数据包含外来字符,我找不到可靠地将它们转换为 XML / utf-8 友好实体的方法,以下错误是我通过阅读设法找到的,我希望一个始终有效的解决方案。

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

科特迪瓦 科特迪瓦(正确)

我设法在我的 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斯蒂格杯 ÖFB Stiegl 杯(错误)

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

我试过了:

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

任何帮助都将不胜感激,因为我正在努力让事情正确保存。

【问题讨论】:

  • 为什么不用字符本身呢? UTF-8 可以编码任何 Unicode 字符。
  • 请问这是什么意思。目前我保存我的 xml 文档,在浏览器中加载它,我看到了错误。
  • ok 试过了,查看时我看到:
     Côte d'Ivoire ÖFB Stiegl Cup Ykkönen 
    他们看起来都错了 :(
  • 看起来您正在提供 utf-8 编码的数据,但说“它都是 iso-8859 编码的”。您是否设置了正确的“Content-type:...; charset=utf-8”标头?也可以通过php.net/ini.core#ini.default-charset 完成

标签: php xml character-encoding


【解决方案1】:

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

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

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

【讨论】:

  • 天啊!!!我刚准备上传文件,发现我用的是tidy,就是破坏人物。正如您和其他人正确提到的那样,它现在通过了正确的方式。真是个笨蛋:(非常感谢您的帮助。
  • 没问题 :-) 并感谢您指出问题所在(可能对其他人有用 ;-))
【解决方案2】:

不要为实体编码而烦恼。请改用 CDATA 块。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2016-07-29
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    相关资源
    最近更新 更多