UTF32和C#问题

时间:2012-04-03 05:44:32

标签: 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创建文本文件,使用单声道作为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

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

谢谢!

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

我试过这个,它在我的电脑上运行良好。

System.IO.StreamReader streamReader = new System.IO.StreamReader("input", true);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter("output", false);

streamWriter.Write(streamReader.ReadToEnd());

streamWriter.Close();
streamReader.Close();

您认为UTF32中的文字可能不是

答案 2 :(得分:0)

写入时你没有指定UTF-32,所以它默认为Encoding.UTF8。

来自MSDN

  

此构造函数使用UTF-8编码创建StreamWriter而不使用   字节顺序标记(BOM),因此其GetPreamble方法返回一个空字节   阵列。要使用UTF-8编码和BOM创建StreamWriter,   考虑使用指定编码的构造函数,例如   StreamWriter(String,Boolean,Encoding)。

答案 3 :(得分:0)

我认为您还需要为Encoding.UTF32指定相同的编码(StreamWriter)。

编辑:

通常在UTF代码页之间不需要,但我也会尝试这个:

Encoding utf8 = Encoding.UTF8;
Encoding utf32 = Enconding.UTF32;
byte[] utf8Bytes = utf8.GetBytes(yourText);
byte[] utf32Bytes = Encoding.Convert(utf8, utf32, utf8Bytes);
string utf32Text = iso.GetString(utf32Text);

答案 4 :(得分:0)

来自MSDN的备注部分StreamReader's constructor

  

此构造函数初始化编码指定的编码   参数,内部缓冲区大小为1024字节。该   StreamReader对象尝试通过查看来检测编码   流的前三个字节。它会自动识别UTF-8,   如果文件启动,则使用little-endian Unicode和big-endian Unicode文本   使用适当的字节顺序标记。否则,用户提供   使用编码。有关更多信息,请参阅Encoding.GetPreamble方法   信息。

文件开头的字节顺序标记很可能实际上是指示UTF 16(或其他东西),因此它没有使用您明确声明的UTF 32编码。