我想解析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,因爲我第一次設置它。
xml文件的頂部是否有編碼?例如:<?xml version =「1.0」encoding =「utf-8」?>如果不是,添加它時會發生什麼?您尚未指定用於加載xml文件的編碼,因此即使設置了「Console.OutputEncoding」,編碼也可能不匹配。 – Ryan 2015-04-04 17:56:21
@瑞恩是的,它有。我認爲xml文件會在頂部聲明編碼是非常常見的,所以我沒有添加它,所以我會編輯它:)並且可以告訴我如何在通過XmlDocument加載xml文件時指定編碼。加載,我找了它,但我找不到如何做到這一點。 – witoong623 2015-04-04 18:02:06