8

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

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

谢谢!

4

5 回答 5

6

K,所以我想通了,我想,它现在似乎工作了。事实证明,由于字符的代码是 15 9E 02 00 和 15 9E 00 00,所以它们不可能保存在一个单一的 UTF-16char中。因此,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

于 2012-04-09T02:03:43.297 回答
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 的文本不是.

于 2012-04-03T07:11:49.043 回答
0

编写时您没有指定 UTF-32,因此它默认为 Encoding.UTF8。

来自MSDN

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

于 2012-04-03T06:01:55.170 回答
0

我认为您还需要Encoding.UTF32为您的StreamWriter.

编辑:

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

Encoding utf8 = Encoding.UTF8;
Encoding utf32 = Encoding.UTF32;
byte[] utf8Bytes = utf8.GetBytes(yourText);
byte[] utf32Bytes = Encoding.Convert(utf8, utf32, utf8Bytes);
string utf32Text = utf32.GetString(utf32Bytes);
于 2012-04-03T06:06:10.377 回答
0

从StreamReader 的构造函数的 MSDN 的备注部分:

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

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

于 2012-04-03T07:16:19.640 回答