18

C# を使用してノルウェー語の文字を XML ファイルに書き込む際に問題が発生しています。ノルウェー語のテキスト (æøå のような文字) を含む文字列変数があります。

XmlTextWriter を使用して XML を作成し、内容を次のように MemoryStream に書き込みます。

MemoryStream stream = new MemoryStream();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stream, Encoding.GetEncoding("ISO-8859-1"));
xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.WriteStartDocument(); //Start doc

次に、ノルウェー語のテキストを次のように追加します。

xmlTextWriter.WriteCData(myNorwegianText);

次に、次のようにファイルをディスクに書き込みます。

FileStream myFile = new FileStream(myPath, FileMode.Create);
StreamWriter sw = new StreamWriter(myFile);

stream.Position = 0;
StreamReader sr = new StreamReader(stream);
string content = sr.ReadToEnd();

sw.Write(content);
sw.Flush();

myFile.Flush();
myFile.Close();

問題は、これに関するファイルでは、すべてのノルウェーのキャラクターがおかしく見えることです。

私はおそらく上記のことを愚かな方法で行っています。それを修正する方法について何か提案はありますか?

4

6 に答える 6

13

なぜ最初にXMLをMemoryStreamに書き込み、次にそれを実際のファイルストリームに書き込むのですか?それはかなり非効率的です。FileStreamに直接書き込む場合は、機能するはずです。

それでも二重書き込みを実行したい場合は、何らかの理由で、次の2つのいずれかを実行します。また

  1. 使用するStreamReaderオブジェクトとStreamWriterオブジェクトがすべて、XmlWriterで使用したものと同じエンコーディングを使用していることを確認してください(他の誰かが提案したようなStreamWriterだけではありません)。

  2. StreamReader/StreamWriterを使用しないでください。代わりに、単純なbyte[]とStream.Read/ Writeを使用して、バイトレベルでストリームをコピーするだけです。とにかく、これははるかに効率的です。

于 2008-09-26T13:05:52.307 に答える
13

エンコーディングを指定していないため、StreamWriterとStreamReaderの両方でUTF-8を使用しています。それが物事が壊れている理由です。

tomasrが言ったように、最初にFileStreamを使用する方が簡単ですが、MemoryStreamには便利な「WriteTo」メソッドがあり、FileStreamに非常に簡単にコピーできます。

ちなみに、実際のコードにusingステートメントがあることを願っています。書き込み中に問題が発生した場合に、ファイルハンドルを開いたままにしないでください。

ジョン

于 2008-09-26T13:16:16.417 に答える
8

文字列を書き込んだり、バイナリ データを文字列として読み取ったりするたびに、エンコーディングを設定する必要があります。

    Encoding encoding = Encoding.GetEncoding("ISO-8859-1");

    FileStream myFile = new FileStream(myPath, FileMode.Create);
    StreamWriter sw = new StreamWriter(myFile, encoding);

    stream.Position = 0;
    StreamReader sr = new StreamReader(stream, encoding);
    string content = sr.ReadToEnd();

    sw.Write(content);
    sw.Flush();

    myFile.Flush();
    myFile.Close();
于 2008-09-26T13:51:02.027 に答える
5

上記の回答で述べたように、ここでの最大の問題は、Encoding指定されていないためにデフォルトになっている です。

Encodingこの種の変換に を指定しない場合、デフォルトのUTF-8が使用されます。これは、シナリオに一致する場合と一致しない場合があります。また、データを にプッシュしてから にプッシュすることで、データを不必要に変換してMemoryStreamFileStreamます。

元のデータが でない場合、UTF-8への最初の遷移でMemoryStreamデフォルトEncodingUTF-8- を使用してデコードが試行され、結果としてデータが破損します。次に、デフォルトでエンコーディングとしてFileStreamも使用UTF-8されている に書き出すと、その破損をファイルに保持するだけです。

この問題を解決するには、オブジェクトに指定する必要がある可能性がありEncodingますStream

実際にはMemoryStreamプロセスを完全にスキップすることもできます。これにより、より高速で効率的になります。更新されたコードは次のようになります。

FileStream fs = new FileStream(myPath, FileMode.Create);

XmlTextWriter xmlTextWriter = 
    new XmlTextWriter(fs, Encoding.GetEncoding("ISO-8859-1"));

xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.WriteStartDocument(); //Start doc

xmlTextWriter.WriteCData(myNorwegianText);

StreamWriter sw = new StreamWriter(fs);

fs.Position = 0;
StreamReader sr = new StreamReader(fs);
string content = sr.ReadToEnd();

sw.Write(content);
sw.Flush();

fs.Flush();
fs.Close();
于 2012-11-23T22:04:35.843 に答える
3

結果ファイルを表示するためにどのエンコーディングを使用しますか?ISO-8859-1に含まれていない場合、正しく表示されません。

たとえばUTF8の代わりに、この特定のエンコーディングを使用する理由はありますか?

于 2008-09-26T12:55:04.237 に答える
0

調査した結果、これが私にとって最も効果的でした:

var doc = new XDocument(new XDeclaration("1.0", "ISO-8859-1", ""));
        using (XmlWriter writer = doc.CreateWriter()){
            writer.WriteStartDocument();
            writer.WriteStartElement("Root");
            writer.WriteElementString("Foo", "value");
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
        doc.Save("dte.xml");
于 2016-02-18T19:41:40.437 に答える