“? ?“符号在c#中保存unicode文件时
本文关键字:unicode 保存 文件 符号 符号在 | 更新日期: 2023-09-27 18:10:01
我有一些问题,当保存配置- unicode文本保存为"???"。但问题只出现在Windows 2003与。net Framework v2。当我用。net 4在WinXP上测试我的代码时,它工作得很好,尽管它在设置中针对。net框架v2。我试过做不同的转换,比如
Encoding.ASCII.GetString(
Encoding.Convert(Encoding.ASCII,
Encoding.Unicode,
Encoding.Unicode.GetBytes(backupPathTextBox.Text)));
但是它总是返回"?? "或者一些不可读的符号。我在谷歌上搜索了这个问题,发现所有c#字符串都以UTF16代码页表示,但c#中没有内置的UTF16解码器。有人能给我指路吗?
Encoding.ASCII.GetString(
Encoding.Convert(Encoding.ASCII,
Encoding.Unicode,
Encoding.Unicode.GetBytes(backupPathTextBox.Text)));
Encoding.Unicode
实际上是UTF-16LE编码,其中每个代码单元使用两个字节存储(因此ASCII字符之间的字节为零)。微软称其为"Unicode",因为在很早的时候,他们希望它被用作Unicode最常见的编码,但事实并非如此,现在这个名字完全是误导。
你的代码做的是:
将文本字符串转换为UTF-16LE字节;
然后将它们从ASCII字节(它们不是)转换为UTF-16LE字节,这意味着在每个字节之间添加了一个额外的零字节;
然后将这些字节转换回字符串,就像它们是ASCII一样,这意味着你将得到与开始时基本相同的字符串,但是每个字符多三个零字节,非ASCII字符变成两个。
你到底想用这个做什么?如果您想将Unicode字符串放入与ascii兼容的文本文件中,那么您想要的编码通常是UTF-8,而不是UTF-16。将字符串转换为UTF-8字节非常简单:
new UTF8Encoding(false).GetBytes(backupPathTextBox.Text)
或者直接使用UTF-8 TextWriter
来写字符串