我遇到一些问题,保存配置时 - unicode文本保存为“???”。但问题仅出现在带有.Net Framework v 2的Windows 2003上。当我使用.Net 4在WinXP上测试我的代码时它运行正常,尽管它在设置中针对.Net Framework v2。 我尝试过进行不同的转换,例如
Encoding.ASCII.GetString(
Encoding.Convert(Encoding.ASCII,
Encoding.Unicode,
Encoding.Unicode.GetBytes(backupPathTextBox.Text)));
但它总是返回“???”或一些不可读的符号。我搜索了这个问题,发现所有C#字符串都以UTF16代码页表示,但C#中没有UTF16解码器buitl-in。 谁能引导我走向正确的方向?
答案 0 :(得分:4)
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
直接写字符串。