1

file.xmlIso-latin-15 (別名 Iso-Latin-9) でエンコードされた XML ドキュメントがあります。

<?xml version="1.0" encoding="iso-8859-15"?>
<root xmlns="http://stackoverflow.com/demo">
  <f>€.txt</f>
</root>

私のお気に入りのテキスト エディターから、このファイルが Iso-Latin-15 (UTF-8 ではない) で正しくエンコードされていることがわかります。

私のソフトウェアは C# で書かれており、要素を抽出したいと考えていますf

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("file.xml"); 

実際には、資格情報を設定するための XMLResolver があります。しかし、基本的に、私のコードはそれと同じくらい単純です。読み込みはスムーズに進み、例外は発生していません。

さて、値を抽出するときの問題:

//xnsm is the XmlNameSpace manager
XmlNode n = xmlDoc.SelectSingleNode("//root/f", xnsm); 
if (n != null)
  String filename = n.InnerText;

Visual Studio デバッガーは filename = を表示します。□.txt

Visual Studio のバグである可能性があります。残念ながらFile.Exists(filename)、ファイルは実際に存在しますが、false を返します。

どうしたの?

4

3 に答える 3

5

私の記憶が正しければ、XmlDocument.Load(string)メソッドは XML エンコーディングに関係なく、常に UTF-8 を前提としています。

StreamReader正しいエンコーディングでを作成し、それをパラメータとして使用する必要があります。

xmlDoc.Load(new StreamReader(
                     File.Open("file.xml"), 
                     Encoding.GetEncoding("iso-8859-15"))); 

編集:

Microsoft からKB308061を偶然見つけました。興味深い一節があります:

XML ドキュメントの XML 宣言セクションでエンコーディング宣言を指定します。たとえば、次の宣言は、ドキュメントが UTF-16 Unicode エンコード形式であることを示しています。

<?xml version="1.0" encoding="UTF-16"?>

この宣言は、XML ドキュメントのエンコード形式のみを指定するものであり、データの実際のエンコード形式を変更または制御するものではないことに注意してください

于 2010-12-09T14:15:57.250 に答える
3

デバッガーまたはコンソールを使用して文字列を文字列として表示しないでください。

代わりに、文字列の内容を一度に 1 文字ずつダンプします。例えば:

foreach (char c in filename)
{
    Console.WriteLine("{0}: {1:x4}", c, (int) c);
}

これにより、現在のフォントが表示できるものに制約されるのではなく、文字列の実際の内容が Unicode コード ポイントで表示されます。

Unicode コード表を使用して、指定された文字を調べてください。

于 2010-12-09T14:16:04.150 に答える
0
  1. あなたのxmlはそのエンコーディングを正しく定義していますか? encoding="iso-8859-15" .. iso-latin-15 です

  2. 理想的には、コンテンツを CDATA 要素内に配置する必要があるため、xml は次のようになります。<f><![CDATA[€.txt]]></f>

  3. xml は通常、http を介して通信するためのものであるため、理想的には、すべての特殊文字を同等の URL エンコード (または http エンコード) 値でエスケープする必要もあります。

€の正確なエスケープコードはわかりませんが、このようなものになります

<f><![CDATA[%3E.txt]]></f>

上記により、xml を介して € が正しく伝達されるようになります。

于 2010-12-09T14:20:48.000 に答える