我有一個應該用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