3

「ISO-8859-1」(Latin-1) でエンコードされた XML ファイルを受け取りました

私が持っているファイル内(他のタグの中でも)<OtherText>Example &quot;content&quot; And &#9472;</OtherText>

なんらかの理由で、これを XMLTextReader にロードし、"XmlReader.Value" を実行して値を返すと、"content" が返されます。そして ─

次に、Latin-1 エンコーディングのみを受け入れるデータベースに直面すると、明らかにエラーになります。

私は次のことを試しました:

  • バイトに変換し、Encoding.Convert を使用して UTF-8 から Latin-1 に変更します (代わりに "?" が大量に表示されます)。
  • StreamReader(file,Encoding.whatever ) を使用しファイルを XmlTextReader にロードする

そして、いくつかのバリエーションと、インターネットおよび StackOverflow istelf でのさまざまな方法があります。

.NET 文字列が UTF-16 であることは理解していますが、理解できないのは、UTF-8 文字が存在する場合の正しいマークアップを含む完全に Latin-1 形式の XML ファイルであり、古いデータベースおよび Web と互換性がある理由です ( HTML マークアップなど) を単純に上書きし、UTF-8 でエンコードされた文字列を出力します。

独自のカスタム テキスト パーサーを作成する以外に、これを回避する方法はありませんか ???

4

1 に答える 1

3

これはエンコーディングの問題ではないと思います。表示されているのは、エスケープされていない XML 文字列です。

問題は&quot;XML エスケープ文字であるため、XMLTextReader がこれをエスケープ解除します。

これを変更すると:

<OtherText>Example &quot;content&quot; And &#9472;</OtherText>

これに:

<OtherText>Example &amp;quot;content&amp;quot; And &amp;#9472;</OtherText>

それで

   XmlReader.Value = "&quot;content&quot; And &#9472;";

パーサーによって無視されるように、値を CDATA でラップする必要があります。

別のオプションは、文字列を再エスケープすることです。

    using System.Security;
....
....
    string val = SecurityElement.Escape(xmlReader.Value);
于 2010-07-22T15:06:28.570 に答える