XML中错误的混合字符编码

时间:2009-07-27 04:09:33

标签: xml character-encoding

我有一个自动生成的XML文件,应该用UTF-8编码。在大多数情况下,编码是正确的。但是,有一些字符编码不正确。在Emacs中查看文件时,我得到\ 370,\ 351。

有没有办法以编程方式检测他们的字符?我更喜欢使用PHP的解决方案,但Perl或Java中的解决方案也非常有用。

3 个答案:

答案 0 :(得分:3)

您可以使用此正则表达式检查字符串的UTF-8-ness:

(^(?:
[\x00-\x7f] |
[\xc0-\xdf][\x80-\xff] |
[\xe0-\xef][\x80-\xff]{2} |
[\xf0-\xf7][\x80-\xff]{3}
)*$)x

答案 1 :(得分:1)

您是否绝对确定编码不正确?我没有使用emacs,而是使用二进制文件查看器。问题位置的实际字节数是多少?

使用Java,检测无效的UTF-8字节模式相当容易。我不确定默认的Charset支持是否会处理它,但UTF-8非常简单。我通常使用UTF-8 table here作为有效字节序列的参考。

答案 2 :(得分:0)

您可以使用libxml_use_internal_errorslibxml_get_errors来循环播放文档时发生的错误。您正在寻找的错误代码是XML_ERR_INVALID_CHAR = 9。

<?php
$xml = '<?xml version="1.0" encoding="utf-8"?>
<a>
    <b>' . chr(0xfd) . chr(0xff) . '</b>
</a>';
libxml_use_internal_errors(true);

$doc = new DOMDocument;
$doc->loadxml($xml);

foreach (libxml_get_errors() as $error) {
    print_r($error);
}
libxml_clear_errors();

打印

LibXMLError Object
(
    [level] => 3
    [code] => 9
    [column] => 5
    [message] => Input is not proper UTF-8, indicate encoding !
Bytes: 0xFD 0xFF 0x3C 0x2F

    [file] => 
    [line] => 3
)