2009-04-21 24 views
1

XML文書がUTF-8で正しくエンコードされており、XML UTF-8エンコーディングで許可されていない文字が含まれていないかどうかを調べる方法があるかどうかを知りたい。事前にXMLエンコーディングの問題

<?xml version="1.0" encoding="utf-8"?> 

おかげで、 ジョージ

EDIT1:ここに私のXMLファイルの内容は、両方のテキスト形式で、バイナリ形式で、あります。

http://tinypic.com/view.php?pic=2r2akvr&s=5

私は(理由はUTF-8の範囲外の無効な)結果が正しいか、確認するためにxmlstarletのようなツールを使用しようとしましたが、エラーメッセージがあるため、私の投稿のリンクには、正しくありません上の例では、0xDFDDの値を持つcharはありません。何か案は?

BTW:誰にでもXMLファイルを送信できますが、ここで添付ファイルとしてアップロードする方法が見つかりませんでした。分析にこのファイルが必要な人は、私に知らせてください。

D:\xmlstarlet-1.0.1-win32\xmlstarlet-1.0.1>xml val a.xml 
a.xml:2: parser error : Char 0xDFDD out of allowed range 
<URL>student=1砜濏磦</URL> 
      ^
a.xml:2: parser error : Char 0xDFDD out of allowed range 
<URL>student=1砜濏磦</URL> 
      ^
a.xml:2: parser error : internal error 
<URL>student=1砜濏磦</URL> 
      ^
a.xml:2: parser error : Extra content at the end of the document 
<URL>student=1砜濏磦</URL> 
      ^
a.xml - invalid 

EDIT2:私もXMLファイルの妥当性をチェックするためのツールのlibxmlを使用しますが、このツールを起動すると、エラーと会ってきました。ここに画面のスナップショットがあります。何か案は?

http://tinypic.com/view.php?pic=2ildjpe&s=5

OSは、Windows Server 2003 x64のです。

+0

プログラムでこれをやりたいのですか、ツールをお探しですか?これはプログラミングについてですか? – thomasrutter

+0

ツールをお探しの場合は、CodeToGloryに記載されているようなオンラインツールが使用できますか? – bortzmeyer

+0

私はプログラミング方法でこれをやりたいありがとう。より良い.Netコード。どんなアイデアthomasrutterとbortzmeyer? – George2

答えて

2

は、私はあなたがプログラムでこれをしたいと推定

  1. http://validator.w3.org/#validate_by_input

  2. http://www.w3schools.com/XML/xml_validator.asp

+0

OPは最近のコメントで、彼はオンラインツールを望まないと述べています。 – bortzmeyer

+0

@CodeToGlory、申し訳ありませんが私のニーズを非常に明確に指定していませんでした。私は.Net(C#)を使用しており、いくつかのC#ソリューションを探しています。既存の.Net APIの組み合わせを使用する方が良いでしょう。 :-) 何か案は? – George2

1

これらを試してみてください?その場合、これは使用しているプログラミング言語にどのような言語が依存するかが大きく異なります。

たとえば、前にPHPでこのコードを使用しました。 preg_matchはパターンを扱う/ u修飾子(私はPHP固有のものだと思います)と、UTF-8として照合される文字列を許可します。副作用は、これを行うたびに文字列全体がUTF-8の妥当性をチェックすることです。 HTML/XHTMLでは、タブ、改行、スペースなどとは別にC0/C1の制御コードを使用することはできませんので、ここでもそれらのチェックを行う方法を追加しました。

function validate($allowcontrolcodes = false) 
    // returns true if this is a valid utf-8 string, false otherwise. 
    // if allowcontrolcodes is false (default), then most C0 codes below 0x20, as 
    // well as C1 codes 127-159, will be denied - recommend false for html/xml 
    { 
     if ($this->string=='') return ''; 
     return preg_match($allowcontrolcodes 
      ? '/^[\x00-\x{d7ff}\x{e000}-\x{10ffff}]++$/u' 
      : '/^[\x20-\x7e\x0a\x09\x0d\x{a0}-\x{d7ff}\x{e000}-\x{10ffff}]++$/u', 
      $this->string) ? true : false; 
    } 

もう1つの方法は、多くの言語で利用可能なDOMを使用することです。 DOMドキュメントオブジェクトには、XML形式の文字列からドキュメントをロードするLoadXMLメソッドがあります。入力したドキュメントが指定された文字エンコーディングに基づいて有効ではなく、特にUTF-8エンコーディングを強制しない場合は失敗しますが、成功した場合はドキュメントオブジェクトの「エンコーディング」プロパティをチェックすることができますそれがどんなエンコーディングであるかを見てください

+0

1.私は.Netを使用していますが、使用できるC#コードはありますか? 2.「副作用は、あなたがこれを行うたびに文字列全体がUTF-8の有効性をチェックされるということです。なぜそれが副作用ですか?私はこのように毎回妥当性をチェックしなければならないと思いますか?あなたがスマートではないと思うどんなポイント/改善するのに十分な効率性(なぜあなたは "副作用"と言った)? – George2

+0

申し訳ありませんが、私はC#と.NETに精通していません。/u修飾子はPHP固有であり、UTF-8モードの正規表現チェックであり、副作用としてUTF-8の妥当性をチェックします。あなたはDOMにもっと幸運を祈るかもしれません。たとえば、http://support.microsoft.com/kb/317664 System.Xml.XmlDocumentには、XMLドキュメントをインポートした後に使用された文字エンコーディングを確認する方法(「エンコーディング」プロパティなど)があります。ドキュメントは解析されないエンコーディングに従って有効ではありません。 – thomasrutter

+0

@thomasrutter、あなたは私のサンプル(私はEDIT 1のセクションに掲載)に私を見せてもらえますか?XML UTF-8デコーダーの「Invalid Byte Sequences」として扱われるのはなぜですか? XMLファイルのテキスト形式と関連するbianry 16進値の両方を投稿しました。 – George2

2

libxml2は、ライブラリとして(プログラムに統合するために)、またはコマンドラインツールxmllintを通じて利用できます。

[Proper file] 
% head test.xml 
<?xml version="1.0" encoding="utf-8"?> 
<café>Ils s'étaient ... 

% xmllint --noout test.xml 
% 

[One byte in a multibyte character removed] 
% xmllint --noout test.xml 
test.xml:2: parser error : Input is not proper UTF-8, indicate encoding ! 
Bytes: 0xC3 0x74 0x61 0x69 
<café>Ils s'Ãtaient ... 
      ^
+0

こんにちはbortzmeyer、.NETコードで簡単に使えるライブラリ? – George2

+0

私はコマンドライン機能に興味があります。 libxml2ツールを使用してXML文書に無効な文字があるかどうか: – George2

+0

共有することはどういう意味ですか?私は使用例とlibxml2 WebサイトのURLを示しました。それで十分じゃない? – bortzmeyer

1

これを行う最も簡単な方法は、単にこのチェックを実行するためのコマンドラインユーティリティを使用してXMLを実行することです。ここではxmllintとの一例です。

私はいつもXMLStarのコピーをこのようなものに用意しています。すぐにXMLを解析できるかどうかを示すので、エンコードが正しいかどうかを示します。

これを行うコード化された方法をお探しの場合は、選択したXMLパーサーにXMLを読み込むだけです。エンコーディングエラーすぐにがパーサー例外をトリガーする(エンコーディングが間違っているため、定義によって解析が行えないため)

XmlDocument xDoc = new XmlDocument(); 

次に、loadメソッドを使用して、指定されたストリームからXMLドキュメントをロードします。

xDoc.Load("sampleXML.xml"); 
+0

@Brian、私は.Netコードを書いています。既存の.Net APIを使って確認する方法は簡単ですか? – George2

+0

上記(編集済みの回答)を参照してください。 .netパーサー –

+0

@Brianを使ってください。混乱します。あなたは ".net parser"と答えましたか?どうか教えてください。 – George2

1

問題の原因はわかりませんが、UTF-8の制限やエンコード処理のエラーではありません。 UTF-8はUnicodeに認識されているすべての文字をエンコードすることができ、問題のあるバイトシーケンス(ED BF 9DED B4 82)が有効です。つまり、最初のバイトは1110で始まり、3バイトシーケンスを示し、継続バイトとして想定されるように10となります。彼らがしようとしている値はで無効です。

UnicodeとISO/IEC 10646は、U + D800-U + DFFF範囲内のコードポイントのいずれにも文字を割り当てないため、サロゲートペアからの個々のコード値は文字を表します。 -Wikipedia

あなたの問題の文字はU+DFDDU+DD02です。サロゲートペアに使用されている範囲から2文字あるという事実は、であることを意味すると思われるかもしれませんが、サロゲートペアですが、動作しません。サロゲートペアを使用するのはUTF-16です。 UTF-8は、文字を単一の4バイトシーケンスとしてエンコードします。

もう1つの可能性はmodified UTF-8であり、で、サロゲートペアの各バイトを別々にエンコードします。しかし、どちらも機能しません。サロゲートペアは常に上位サロゲート範囲(U+DC00..U+DFFF)からの1バイトと低いサロゲート範囲(U+D800..U+DBFF)からの1バイトで構成されます。これらの文字は両方とも高サロゲート範囲のものです。

したがって、誤ったエンコードではなく悪いデータの問題があるようです。私たちがそれらのキャラクターがどんなものであるべきかを知っていれば、多くの助けになります。それでは、あなたが期待しているデータの種類(例えば、どのような言語)、データがどこから来たのか、何が行われたのか、そのようなことについての情報はありません。

+0

@Alan、「問題の文字はU + DFDDとU + DD02」 - 混乱しています。投稿されたXMLコンテンツにU + DFDD文字が含まれていますか? – George2

+0

別の混乱は、UTF-16/UCS-2ウィキペディアのページを引用する理由ですか?私の質問は、UTF-16/UCS-2を扱うのではなく、UTF-8を扱っています。 :-) – George2

+0

UTF-8バイトシーケンスED BF 9DおよびED B4 82は、U + DFDDおよびU + DD02にデコードします。 UTF-16ページについては、UTF-16サロゲートペアのために予約されているため、なぜこれらのコードポイントが有効でないのかを説明する最も簡潔な方法のようでした。 –

関連する問題