2015-04-04 40 views
0

我想解析xml文件以打印字符控制檯或winforms。它看起來像這樣,從xml文件讀取字符時控制檯打印錯誤字符

<?xml version="1.0" encoding="UTF-8"?> 
<kanjidic2> 
<header> 
    <file_version>4</file_version> 
    <database_version>2015-093</database_version> 
    <date_of_creation>2015-04-03</date_of_creation> 
</header> 
<character> 
    <literal>亜</literal> 
    <codepoint> 
    <cp_value cp_type="ucs">4e9c</cp_value> 
    <cp_value cp_type="jis208">16-01</cp_value> 
    </codepoint> 
</character> 
<character> 
    <literal>唖</literal> 
    <codepoint> 
    <cp_value cp_type="ucs">5516</cp_value> 
    <cp_value cp_type="jis208">16-2</cp_value> 
    </codepoint> 
</character> 

... 
</kanjidic2> 

凡字符literal標記是什麼,是想打印出來。該字符本身以UTF8編碼(提供者說)。 我用這段代碼解析並在控制檯中打印出來。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.OutputEncoding = Encoding.UTF8; 

     foreach (Kanji kanji in Parse()) 
     { 
      Console.WriteLine(kanji.Character); 
     } 

     Console.ReadKey(); 
    } 

    private static IEnumerable<Kanji> Parse() 
    { 
     var doc = new XmlDocument(); 
     doc.Load("kanjidic2.xml"); 

     XmlNodeList nodes = doc.DocumentElement.SelectNodes("/kanjidic2/character"); 

     foreach (XmlNode node in nodes) 
     { 
      yield return new Kanji { Character = node.SelectSingleNode("literal").InnerText }; 
     } 
    } 
} 

public class Kanji 
{ 
    public string Character { get; set; } 
} 

當我運行程序時,它開始打印字符,但它不是性格,我已經看到它在literal(我認爲沒有人能夠閱讀)。 我試過改變控制檯輸出編碼到Unicode這次打印正確的字符。

問題是爲什麼當我將輸出編碼設置爲UTF8時,控制檯不能正確打印字符?

是因爲它讀取以UTF8編碼的字符並將該字符作爲Unicode存儲在內存中(這意味着UTF16在.net中?)?如果是的話,爲什麼它不能將字符轉換回UTF8,因爲我第一次設置它。

+0

xml文件的頂部是否有編碼?例如:<?xml version =「1.0」encoding =「utf-8」?>如果不是,添加它時會發生什麼?您尚未指定用於加載xml文件的編碼,因此即使設置了「Console.OutputEncoding」,編碼也可能不匹配。 – Ryan 2015-04-04 17:56:21

+0

@瑞恩是的,它有。我認爲xml文件會在頂部聲明編碼是非常常見的,所以我沒有添加它,所以我會編輯它:)並且可以告訴我如何在通過XmlDocument加載xml文件時指定編碼。加載,我找了它,但我找不到如何做到這一點。 – witoong623 2015-04-04 18:02:06

回答

0

有幾個潛在的問題,你可能會遇到這裏。

  1. 控制檯有問題顯示其他字符集,如漢字,沒有額外的努力或代碼。您可以嘗試changing the Console font TrueType字體,如Consolas或Courier New。或者對於UTF-32,請查看代碼示例here
  2. 你的xml文件是沒有BOM的UTF8,如果這是靜態的(不會改變),那麼你最好在你的代碼中指定它。您的gist正在使用Encoding.Default,但是當我將其更改爲Encoding.UTF8時,漢字字符串是正確的。我看着methods for detecting the encoding,但你需要決定你的XML文件是否會改變編碼。
  3. 我用十六進制編輯器查看了第一個<literal>亜</literal>,它是,但是當我將該字符粘貼到Visual Studio中時,它僅僅是E4 9C。我相信BAcombining character。如果您的編碼錯誤,您可能會看到亜。如果你不使用TTF字體,你會看到瘋狂的角色。即使在我的系統上使用Consolas,E4 9C字符串也顯示一個盒裝問號,但是當我複製並粘貼時,它是正確的字符。
0

嘗試加載XML的UTF8字節,然後加載XML文件:如果你有一個文件,而不是一個XML字符串

byte[] encodedString = Encoding.UTF8.GetBytes(xmlString); 
 
using (MemoryStream ms = new MemoryStream(encodedString)) 
 
{ 
 
    ms.Flush(); 
 
    ms.Position = 0; 
 
    XmlDocument xmlDoc = new XmlDocument(); 
 
    xmlDoc.Load(ms); 
 
}

只是第一次加載像rgular文件這

var xmlString= File.ReadAllText(FilePath,Encoding.Default) 
+0

'xmlString'是StreamReader.ReadToEnd支持的字符串嗎?我會明天嘗試:) – witoong623 2015-04-04 18:10:01

+0

只是看到更新的答案,從文件中加載字符串,因爲它是默認編碼 – Coder1409 2015-04-04 18:12:05

+0

我測試了它通過使用XmlDocument.LoadXml,不幸的是,我得到了'XmlException'(https:// msdn.microsoft.com/en-us/library/set3a0zx(v=vs.90).aspx)即使它是totaly有效:(無論如何,謝謝。 – witoong623 2015-04-05 02:07:15

相關問題