用单点触摸在c#中显示iso-8859-1字符

问题描述:

我正在从REST Web服务中读取XML文件,解析它并在UITableView中显示细节。 XML文件编码为iso-8859-1,并包含带重音符号的字符。如果我只是将字符串添加到tableview中,那么我会显示一个垃圾字符,所以我试图将它转换为UTF8,但它被转换为问号,意味着它不理解字符。用单点触摸在c#中显示iso-8859-1字符

下面的代码:

foreach(XmlNode myNode in myNodeList) 
{ 
    Encoding isoEnc = Encoding.GetEncoding ("iso-8859-1"); 

    string utfResult = Encoding.UTF8.GetString (isoEnc.GetBytes(myNode.InnerText)); 

    _myCollection.Add(utfResult); 
} 

任何想法是怎么回事,以及如何显示重音字符?

好的,问题现在解决了。看来我的错误是假定StreamReader默认处理iso-8859-1编码。我改变了我的StreamReader构造来源:

StreamReader reader = new StreamReader (response.GetResponseStream()); 

到:

StreamReader reader = new StreamReader (response.GetResponseStream(), Encoding.GetEncoding("iso-8859-1")); 

通过告诉StreamReader的预期正确的编码,一切只是属于地方。

那么,你对UTF-8的“转换”是高度可疑的。你基本上说你比XML文件更好 - 尽管它声称是ISO-8859-1,你知道它是用UTF-8编码的。你有什么理由相信吗?

如果您知道这些字符的含义,我建议您添加一些日志记录来指示这些字符的Unicode值(作为整数),并将它们与code charts on Unicode.org进行比较。然后你就会知道你的问题是显示这些字符,还是首先从Feed中读取它们。

+0

乔恩,谢谢你。我已经做到了,看起来好像是在阅读而不是展示。使用encoding =“iso-8859-1”定义的XML,但是如果我使用myNode.InnerText构建从节点获取的字符串的字节数组,则该字节是3F,这是一个问号。如果我构建一个unicode数组,它会让我回到FFFD,这是钻石中的问号,这是UITableView上显示的内容。 – 2010-01-04 16:45:03

+0

不要从解析的XML中构建字节数组 - 请在十六进制编辑器中查看XML本身。或者,使用InnerText,但不要将其转换为字节数组 - 将第一个字符转换为整数。请注意,U + FFFD是“替换”字符,它用于Unicode不支持的字符。听起来很可疑。 – 2010-01-04 17:27:38

+0

到达那里。有问题的字符串是“YnysMôn”,在这种情况下,重音字符明显成为问题。 在十六进制编辑器中查看XML我可以看到字符是F4,这是正确的。 如果我使用上面的字符串,并将其显示在UITableView中,那么它显示正常。但是将字符从该节点的InnerText属性中剔除,将其转换为一个int,则会给出65533(或U + FFFD)。这里是代码: char tmpChar = Convert.ToChar(myNode.InnerText.Substring(6,1)); int charVal = Convert.ToInt32(tmpChar); Console.WriteLine(charVal); – 2010-01-04 20:27:34