2011-03-09 43 views
26

我創建一個的XDocument這樣的:爲什麼Xdocument會給我一個utf16聲明?

XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes")); 

當我保存這樣的(doc.Save(@"c:\tijd\file2.xml");)的文件,我得到這樣的:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 

這是確定。

,但我想返回內容爲XML,我發現下面的代碼:

var wr = new StringWriter(); 
      doc.Save(wr); 
      string s = (wr.GetStringBuilder().ToString()); 

此代碼的工作,但隨後的字符串「S」始於此:

<?xml version="1.0" encoding="utf-16" standalone="yes"?> 

所以它從utf8更改爲utf16,這不是我想要的,因爲現在我無法在Internet Explorer中讀取它。

有沒有辦法來防止這種行爲?

+2

有一個大紅旗這裏,串作家確實包含UTF-16編碼字符串。即使您重寫Encoding屬性。這是如何從StringWriter進入IE的? – 2011-03-09 16:54:26

+0

好問題。我使用File.WriteAllText將字符串's'保存到一個文件中,然後用IE打開它。沒有在我的問題中指定得太清楚...... – Michel 2011-03-09 18:41:29

+1

對,File.WriteAllText()調用是*真正*確定編碼的那個。默認值是utf-8,除非您使用需要進行編碼的重載。 – 2011-03-09 18:47:35

回答

36

StringWriter宣傳自己使用UTF-16。這很容易修復:

public class Utf8StringWriter : StringWriter 
{ 
    public override Encoding Encoding { get { return Encoding.UTF8; } } 
} 

這應該是足夠的在您的具體情況。一個較爲全面的實施將:

  • 有構造匹配那些StringWriter
  • 允許編碼在構造函數中被指定過
+1

好的,所以StringWriter使它成爲UTF-16。我總是試圖瞭解編碼的東西,但它似乎並不堅持。聽起來合乎邏輯的是像stringwriter這樣的UTF-16對象創建了一個UTF-16字符串,但令我感到震驚的是它也改變了XML文件中的聲明。沒想到它是由StringWriter引起的,因爲當我在XDocument之前使用XmlDocument時,我也一直在使用UTF-16掙扎,所以我認爲這只是一個.Net習慣。所以謝謝你的答案! – Michel 2011-03-09 18:39:36

+3

@Michel:基本上,Save方法*要求編寫者使用什麼編碼,以便它可以使用任何合適的編碼。這是一個混亂,我同意... – 2011-03-09 18:44:28

+0

感謝您的額外detialed信息。 – Michel 2011-03-09 18:47:12

1

您需要設置StreamWriter.Encoding使用UTF -8而不是Unicode(UTF-16)

鑑於它不是StreamWriter,這個答案只留給子孫後代。

+0

這裏沒有涉及StreamWriter。只有一個StringWriter,你不能以編程方式設置編碼 - 你必須通過繼承: – 2011-03-09 16:47:46

+0

哇,是的,我完全誤讀了什麼被使用,它是繼承。 – msarchet 2011-03-09 16:48:43

2

很好用的回答繼承,只記得覆蓋初始化

public class Utf8StringWriter : StringWriter 
    { 
     public Utf8StringWriter(StringBuilder sb) : base (sb) 
     { 
     } 
     public override Encoding Encoding { get { return Encoding.UTF8; } } 
    } 
相關問題