代码之家  ›  专栏  ›  技术社区  ›  notnoop

XML中的混合字符编码错误

  •  2
  • notnoop  · 技术社区  · 15 年前

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

    有没有一种方法可以通过编程来检测他们的角色?我更喜欢使用PHP的解决方案,但是Perl或Java中的解决方案也非常有用。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Martin v. Löwis    15 年前

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

    (^(?:
    [\x00-\x7f] |
    [\xc0-\xdf][\x80-\xff] |
    [\xe0-\xef][\x80-\xff]{2} |
    [\xf0-\xf7][\x80-\xff]{3}
    )*$)x
    
        2
  •  1
  •   Jon Skeet    15 年前

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

    使用Java可以很容易地检测到无效的UTF-8字节模式。我不确定默认的字符集支持是否能处理它,但是UTF-8非常简单。我通常用 UTF-8 table here 作为有效字节序列的引用。

        3
  •  0
  •   VolkerK    15 年前

    你可以使用 libxml_use_internal_errors libxml_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
    )