c# - UTF32 和 C# 问题

标签 c# encoding mono gedit utf-32

所以我在字符编码方面遇到了一些麻烦。 当我将以下两个字符放入 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

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

希望对大家有帮助:D

关于c# - UTF32 和 C# 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9987706/

相关文章:

javascript - Node.js:crypto.pbkdf2 十六进制密码

Ubuntu 上的 C# HTTPS 服务器

mono - 无需安装单声道即可分发应用程序

macos - 窗口关闭时如何退出 MonoMac 应用程序?

c# - 在对象初始化中尝试 Catch

c# - HttpClient 在没有 Fiddler 的情况下不解密 HTTPS

c# - C#自动创建对象母类

c# - 无法连接到任何指定的 mysql 主机。 C# MySQL

node.js - Node 缓冲区,从 utf8 到二进制

python - re.sub 与 utf-8 字符串的奇怪行为