所以我在字符编码方面遇到了一些麻烦。 当我将以下两个字符放入 UTF32 编码的文本文件中时:
𩸕
鸕
然后在它们上运行这段代码:
System.IO.StreamReader streamReader =
new System.IO.StreamReader("input", System.Text.Encoding.UTF32, false);
System.IO.StreamWriter streamWriter =
new System.IO.StreamWriter("output", false, System.Text.Encoding.UTF32);
streamWriter.Write(streamReader.ReadToEnd());
streamWriter.Close();
streamReader.Close();
我得到:
鸕
鸕
(相同字符两次,即输入文件!=输出)
一些可能有帮助的事情: 第一个字符的十六进制:
15 9E 02 00
第二个:
15 9E 00 00
我使用 gedit 来创建文本文件,使用 mono 来创建 C#,我正在使用 Ubuntu。
如果我指定输入或输出文件的编码也没有关系,如果它是 UTF32 编码它只是不喜欢它。如果输入文件采用 UTF-8 编码,它会起作用。
输入文件如下:
FF FE 00 00 15 9E 02 00 0A 00 00 00 15 9E 00 00 0A 00 00 00
这是一个错误,还是只有我?
谢谢!
最佳答案
K,所以我觉得我想通了,它现在似乎可以工作了。事实证明,由于字符的代码是 15 9E 02 00 和 15 9E 00 00,因此无法将它们保存在一个单一的 UTF-16 char
中。因此,UTF16 改用这些代理对,其中有两个不同的字符充当一个“元素”。要获取元素,我们可以使用:
StringInfo.GetTextElementEnumerator(string fred);
这会返回一个包含代理项对的字符串。将其视为一个字符。
看这里:
http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx
希望对大家有帮助:D
关于c# - UTF32 和 C# 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9987706/