2009-05-14 7 views
6

나는 다음과 같은 코드를 가지고 :XmlWriter를 인코딩 문제

MemoryStream ms = new MemoryStream(); 
    XmlWriter w = XmlWriter.Create(ms); 

    w.WriteStartDocument(true); 
    w.WriteStartElement("data"); 

    w.WriteElementString("child", "myvalue"); 

    w.WriteEndElement();//data 
    w.Close(); 
    ms.Close(); 

    string test = UTF8Encoding.UTF8.GetString(ms.ToArray()); 

는 XML이 제대로 생성된다; 그러나, 내 문제는 '테스트'문자열의 첫 번째 문자입니다 (숯불 # 239), 일부 xml 파서가 잘못된 만들기 : 이것은 어디서 오는 것입니까? 정확히 내가 뭘 잘못하고 있니?

나는 첫 번째 문자 다음에 시작하여이 문제를 해결할 수 있지만 그 문제가 단순히 문제를 패치하는 것보다 그 이유를 알고 싶습니다.

감사합니다.

답변

13

여기에 하나 개의 솔루션을 찾았 http://www.timvw.be/generating-utf-8-with-systemxmlxmlwriter/

내가 상단에이 누락되었습니다 도움말 모두

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); 
xmlWriterSettings.Encoding = new UTF8Encoding(false); 
MemoryStream ms = new MemoryStream(); 
XmlWriter w = XmlWriter.Create(ms, xmlWriterSettings); 

감사합니다!

+2

+1 BOM이 다시 나를 잡았습니다. 감사. – bendewey

+0

BOM은 매번 가져옵니다 ... 기본 Encoding.UTF8에는 BOM이 포함되어 있습니다. –

0

이 같은 인코딩을 변경할 수 있습니다

w.Settings.Encoding = Encoding.UTF8; 
+0

.Settings.Encoding 2 개 조각을 가지고

MemoryStream stream = new MemoryStream(); XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = Encoding.UTF8; settings.Indent = true; settings.IndentChars = "\t"; using (XmlWriter writer = XmlWriter.Create(stream, settings)) { // ... write // Make sure you flush or you only get half the text writer.Flush(); // Use a StreamReader to get the byte order correct StreamReader reader = new StreamReader(stream,Encoding.UTF8,true); stream.Seek(0, SeekOrigin.Begin); result = reader.ReadToEnd(); } 

읽기 전용; 여기

는 솔루션입니다 나는 그게 효과가 있다고 믿지 않는다 – John

+0

정말이야? MSDN을 살펴보면이 속성은 get/set을 모두 지원하지만 나는 그곳에 있다는 것을 알고있다./ – Lloyd

+0

그래. 그것은 당신이 그것을 설정할 수 있습니다; 그러나 런타임 오류 (컴파일 오류 아님)가 발생합니다. – John

2

문제 작가에 의해 생성 된 당신은 XML이 있다는 것이다 UTF- 16 UTF-8을 사용하여 문자열로 변환하십시오. 대신이 시도 :

StringBuilder sb = new StringBuilder(); 
using (StringWriter writer = new StringWriter(sb)) 
using (XmlWriter w = XmlWriter.Create(writer)) 
{ 
    w.WriteStartDocument(true); 
    w.WriteStartElement("data"); 

    w.WriteElementString("child", "myvalue"); 

    w.WriteEndElement();//data 
} 

string test = sb.ToString(); 
+0

UTF-8에 대한 이유는 xmlwriter가 'encoding = utf8'을 출력하도록하기 위해서였습니다. – John

0

편집자가 사용하는 바이트 순서 표시 (예 : Visual Studio에서 UTF8 인코딩 된 XML 및 구문 강조 표시를 올바르게 감지하는 경우)에 신경 쓰면이 모두가 약간 꺼져 있습니다. 나는 전체 here