私は、UTF-8でエンコードされるはずの自動的に生成されたXMLファイルを持っています。ほとんどの場合、エンコーディングは正しいです。ただし、正しくエンコードされていない文字がいくつかあります。 Emacsでファイルを見ると、¥370、¥351が得られます。XMLでの混在文字のエンコーディングが正しくありません
文字をプログラムで検出する方法はありますか?私はPHPを使ったソリューションを好んでいますが、PerlやJavaのソリューションも非常に役立ちます。
私は、UTF-8でエンコードされるはずの自動的に生成されたXMLファイルを持っています。ほとんどの場合、エンコーディングは正しいです。ただし、正しくエンコードされていない文字がいくつかあります。 Emacsでファイルを見ると、¥370、¥351が得られます。XMLでの混在文字のエンコーディングが正しくありません
文字をプログラムで検出する方法はありますか?私はPHPを使ったソリューションを好んでいますが、PerlやJavaのソリューションも非常に役立ちます。
:
(^(?:
[\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を使用します。あなたがこの正規表現と文字列のUTF-8ネスをチェックすることができる
あなたは、ドキュメントがロードされたときに発生したエラーをループし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
感謝です!これをテストし、テストに失敗した場合は 'utf8_encode'で値をラップします。 – notnoop