2009-07-27 12 views
2

私は、UTF-8でエンコードされるはずの自動的に生成されたXMLファイルを持っています。ほとんどの場合、エンコーディングは正しいです。ただし、正しくエンコードされていない文字がいくつかあります。 Emacsでファイルを見ると、¥370、¥351が得られます。XMLでの混在文字のエンコーディングが正しくありません

文字をプログラムで検出する方法はありますか?私はPHPを使ったソリューションを好んでいますが、PerlやJavaのソリューションも非常に役立ちます。

答えて

3

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

感謝です!これをテストし、テストに失敗した場合は 'utf8_encode'で値をラップします。 – notnoop

1

エンコードが間違っていることは間違いありませんか? emacsを使用するのではなく、バイナリファイルビューアを使用します。問題のある位置の実際のバイトは何ですか?

Javaでは、無効なUTF-8バイトパターンを検出することはかなり簡単です。私は、デフォルトのCharsetサポートがそれを処理するかどうかはわかりませんが、UTF-8はかなりシンプルです。私は通常、有効なバイトシーケンスの参照としてUTF-8 table hereを使用します。あなたがこの正規表現と文字列のUTF-8ネスをチェックすることができる

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 
) 
+0

ありがとう!残念ながら、これは最初の無効な文字のみを報告し、エラーから回復しません。したがって、残りのエラーは報告されません。 – notnoop

関連する問題