2013-02-07 1 views
6

다른 resurse에서 API로 보내는 XML이 있습니다. 나는 XDocument에 의해 그것을 만든다 :TextWriter 객체에서 인코딩을 변경하는 방법은 무엇입니까?

XDocument xDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"), 
    new XElement("Entity",new XAttribute("Type", "attribute1"), 
     new XElement("Fields",... 

나는 선언없이 그것을 보낸다.

StringBuilder builder = new StringBuilder(); 
TextWriter writer = new StringWriter(builder); 

using (writer) 
{ 
    xDoc.Save(writer); 
} 

하지만 지금 TextWriter를 변경 인코딩 XML에 UTF-16 : 그래서 다음에 수행. 나는 utf-8에서 다시 그것을 바꿀 필요가있다.

답변

13

이 이상한 것을 시도하지만, 당신이 XML에 UTF-8 인코딩과 string에 출력하고자하는 경우 StringWriter를 서브 클래스해야 것 같습니다.

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     XDocument xDoc = new XDocument(
      new XDeclaration("1.0", "utf-8", "yes"), 
      new XElement("Entity",new XAttribute("Type", "attribute1"))); 

     StringBuilder builder = new StringBuilder(); 
     using (TextWriter writer = new EncodingStringWriter(builder, Encoding.UTF8)) 
     { 
      xDoc.Save(writer); 
     } 

     Console.WriteLine(builder.ToString()); 
    } 
} 

public class EncodingStringWriter : StringWriter 
{ 
    private readonly Encoding _encoding; 

    public EncodingStringWriter(StringBuilder builder, Encoding encoding) : base(builder) 
    { 
     _encoding = encoding; 
    } 

    public override Encoding Encoding 
    { 
     get { return _encoding; }     
    } 
} 
4

TextWriter ws = new StreamWriter(path, true, Encoding.UTF8); 

또는

TextWriter ws = new StreamWriter(stream, Encoding.UTF8); 
+1

또는'Encoding.GetEncoding (1256)'당신은 (1256 아랍어) 특정 코드 페이지를 필요로하는 경우 – BlueChippy

+0

'StreamWriter'이 확실한 해결책처럼 보인다, 예; 이는 결국'XDocument.Save'에 의해 예상되는 타입 인'TextWriter'의 특정 인코딩 - 커스터마이징 구현입니다. String으로 돌아가서 (XML 선언을 올바르게하는 것까지도) 나는 단지 이것을 MemoryStream에서 사용한다. – Nyerguds

관련 문제