UTF32和C#问题

ASt*_*oob 8 c# mono encoding gedit utf-32

所以我遇到了一些字符编码问题.当我将以下两个字符放入UTF32编码的文本文件中时:


?
Run Code Online (Sandbox Code Playgroud)

然后在它们上运行此代码:

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();
Run Code Online (Sandbox Code Playgroud)

我明白了:

?
?
Run Code Online (Sandbox Code Playgroud)

(相同的字符两次,即输入文件!=输出)

一些可能有用的东西:第一个字符的十六进制:

15 9E 02 00

而对于第二个:

15 9E 00 00

我正在使用gedit创建文本文件,使用单声道用于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

这是一个错误,还是仅仅是我?

谢谢!

ASt*_*oob 5

K,所以我想出来,我认为它现在似乎有效.事实证明,由于角色的代码是15 9E 02 00和15 9E 00 00,因此无法将它们保存在单个UTF-16中char.因此,相反,UTF16使用这些代理对,其中有两个不同的字符作为一个"元素".要获取元素,我们可以使用:

StringInfo.GetTextElementEnumerator(string fred);
Run Code Online (Sandbox Code Playgroud)

这会返回一个包含代理项对的字符串.把它当成一个角色.

看这里:

http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx

http://msdn.microsoft.com/en-us/library/system.globalization.textelementenumerator.gettextelement.aspx

希望它可以帮到某人:D