所以我遇到了一些字符编码问题。 当我将以下两个字符放入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
这是一个错误,还是仅仅是我?
谢谢!
答案 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
希望它有助于某人: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编码。