ISO-8859-1 인코딩을 사용하여 XMLTextWriter를 사용하여 XML 파일을 작성합니다

StackOverflow https://stackoverflow.com/questions/139260

문제

C#을 사용하여 노르웨이 문자를 XML 파일에 쓰는 데 문제가 있습니다. 노르웨이 텍스트 (Æøå와 같은 문자 포함)가 포함 된 문자열 변수가 있습니다.

XMLTextWriter를 사용하여 XML을 작성하고 다음과 같은 메모리 스트림에 내용을 작성합니다.

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();

이제 문제는 이것의 파일에서 모든 노르웨이 캐릭터가 재미있어 보인다는 것입니다.

나는 아마 어리석은 방식으로 위의 일을하고있을 것입니다. 그것을 고치는 방법에 대한 제안이 있습니까?

도움이 되었습니까?

해결책

XML을 먼저 MemoryStream에 작성한 다음 실제 파일 스트림에 작성하는 이유는 무엇입니까? 그것은 매우 비효율적입니다. 파일 스트림에 직접 편지를 쓰면 작동해야합니다.

어떤 이유로 든 이중 쓰기를 계속하고 싶다면 두 가지 중 하나를 수행하십시오. 어느 하나

  1. StreamReader 및 StreamWriter가 사용하는 개체가 있는지 확인하십시오. 모두 사용 같은 XMLWriter (다른 사람이 제안한 것처럼 스트림 라이터뿐만 아니라)와 함께 사용한 것을 인코딩하거나

  2. StreamReader/StreamWriter를 사용하지 마십시오. 대신 간단한 바이트 [] 및 stream.read/write를 사용하여 바이트 레벨에서 스트림을 복사하십시오. 이것은 BTW, 어쨌든 훨씬 더 효율적일 것입니다.

다른 팁

인코딩을 지정하지 않기 때문에 Streamwriter와 StreamReader는 UTF-8을 사용하고 있습니다. 그렇기 때문에 상황이 부패하고 있습니다.

Tomasr가 말했듯이, FILESTREAM을 사용하여 시작하여 더 간단 할 것입니다. 그러나 MemoryStream에는 편리한 "WriteTo"방법이있어 매우 쉽게 파일 스트림에 복사 할 수 있습니다.

그런데 실제 코드에 사용 된 명령문이 있기를 바랍니다. 그건 그렇고 글을 쓰는 동안 무언가 잘못되면 파일 핸들을 열어두고 싶지 않습니다.

문자열을 작성하거나 이진 데이터를 문자열로 읽을 때마다 인코딩을 설정해야합니다.

    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();

위의 답변에서 언급했듯이 여기서 가장 큰 문제는 다음과 같습니다. Encoding, 지정되지 않아 채무 불이행 중입니다.

당신이 지정하지 않을 때 Encoding 이런 종류의 변환의 경우 기본값입니다 UTF-8 사용됩니다 - 시나리오와 일치하거나 일치하지 않을 수 있습니다. 또한 데이터를 MemoryStream 그리고 나서 a FileStream.

원래 데이터가 아닌 경우 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();

결과 파일을 표시하는 데 어떤 인코딩을 사용하십니까? ISO-8859-1이 아닌 경우 올바르게 표시되지 않습니다.

예를 들어 UTF8 대신이 특정 인코딩을 사용해야 할 이유가 있습니까?

조사 후, 이것은 나에게 가장 적합한 것입니다.

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");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top