我有一个应该用UTF-8编码的自动生成的XML文件。大部分情况下,编码是正确的。但是,有一些字符没有正确编码。在Emacs中查看文件时,我得到\ 370,\ 351。错误的XML混合字符编码
有没有一种方法来编程检测他们的字符?我更喜欢使用PHP的解决方案,但Perl或Java中的解决方案也会很有帮助。
我有一个应该用UTF-8编码的自动生成的XML文件。大部分情况下,编码是正确的。但是,有一些字符没有正确编码。在Emacs中查看文件时,我得到\ 370,\ 351。错误的XML混合字符编码
有没有一种方法来编程检测他们的字符?我更喜欢使用PHP的解决方案,但Perl或Java中的解决方案也会很有帮助。
您可以检查与此正则表达式的字符串的UTF-8岬:
(^(?:
[\x00-\x7f] |
[\xc0-\xdf][\x80-\xff] |
[\xe0-\xef][\x80-\xff]{2} |
[\xf0-\xf7][\x80-\xff]{3}
)*$)x
你确定编码不正确吗?我没有使用emacs,而是使用二进制文件查看器。有问题的位置的实际字节数是多少?
使用Java可以很容易地检测到无效的UTF-8字节模式。我不确定默认的Charset支持是否可以处理它,但UTF-8非常简单。我通常使用UTF-8 table here作为有效字节序列的参考。
您可以通过加载文档时发生的错误使用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
)
谢谢!不幸的是,这只会报告第一个无效字符,并且从不会从错误中恢复。所以它不会报告其余的错误。 – notnoop 2009-07-27 08:54:34
谢谢!将对此进行测试,如果测试失败,则用`utf8_encode`封装值。 – notnoop 2009-07-27 13:20:25