“? ?“符号在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解码器。有人能给我指路吗?

“? ?“符号在c#中保存unicode文件时

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来写字符串