C# 中的 Unicode.GetString

Ran*_* Hu 2 c# unicode

在 C# 中将一些字节数组与 unicode 字符串一起处理时,我遇到了一个奇怪的问题。下面是我的代码。

var bytes = new byte[] {128, 216};
var strstr = Encoding.Unicode.GetString(bytes);
var newBytes = Encoding.Unicode.GetBytes(strstr);
    
Console.WriteLine(BitConverter.ToString(bytes));
Console.WriteLine(BitConverter.ToString(newBytes));
Run Code Online (Sandbox Code Playgroud)

很简单,对吧?然而,newBytes 与 bytes 不一样,这让我感到震惊。在我看来,GetString 和 GetBytes 应该是相反的操作。谁能告诉我发生了这种事吗?

输出是

80-D8

FD-FF

提前致谢。

Jon*_*eet 5

在我看来,GetString 和 GetBytes 应该是相反的操作。

当数据表示有效字符串时,它们就是。但是,您尝试将 0x80 0xD8 解码为小端 UTF-16 字符串 - 但这不是任何有效字符串的二进制表示形式。它是一个高代理项,后面没有一个低代理项,所以它是无效的。

因此Encoding.GetString将二进制数据解码为U+FFFD,这是解码时遇到无效数据时使用的“替换字符”。

  • @Rang-jiHu:我是 C# in Depth 的作者,但我不会声称“伟大”的部分:) (2认同)