Is UTF-16 compatible with UTF-8?



我问谷歌上面的问题,被发送到UTF-8和UTF-16之间的差异?不幸的是,这并没有回答这个问题。

根据我的理解,UTF-8应该是UTF-16的一个子集,意思是:如果我的代码使用UTF-16,我提交一个UTF-8编码的字符串,一切都应该是好的。另一种方式(期望UTF-8而得到UTF-16)可能会导致问题。

正确吗?

编辑:澄清为什么链接的SO问题不回答我的问题:我的问题出现时,试图使用WebClient.DownloadString处理JSON字符串,因为WebClient使用了错误的编码。我从请求中收到的JSON被编码为UTF-8,对我来说问题是:如果我设置webClient.Encoding = New System.Text.UnicodeEncoding(又名UTF-16),我是否安全,即能够处理UTF-8和UTF-16请求结果,或者我应该使用webClient.Encoding = New System.Text.UTF8Encoding ?

你所说的"兼容"是什么意思并不完全清楚,所以让我们来了解一些基本的东西。

Unicode是底层概念,而UTF-16和UTF-8是编码Unicode的两种不同方式。它们显然是不同的——否则,为什么会有两种不同的序列化格式?

Unicode本身没有指定序列化格式。UTF-8和UTF-16是两种可选的序列化格式。还有其他几种,但这两种可以说是使用最广泛的。

它们是"兼容的";从某种意义上说,它们可以表示相同的Unicode码位,但"不兼容";因为这两种表述是完全不同的,不可调和的。

对于UTF-16还有两个额外的变化。首先,实际上有两种不同的编码,UTF-16LE和UTF-16BE。它们的顺序不同。(UTF-8是一种字节编码,因此没有字节顺序。)其次,传统的UTF-16过去被限制为65,536个可能的字符,这比Unicode当前包含的字符要少。这是用代理处理的,但实际上是旧的和/或破损的UTF-16实现(正确地标识为UCS-2,而不是"真实的")。UTF-16)不支持。

为了更具体一点,让我们比较四个不同的代码点。我们选择U+0041, U+00E5, U+201C和U+1F4A9,因为它们很好地说明了差异。

U+0041是一个7位字符,因此UTF-8仅用一个字节表示它。U+00E5是一个8位字符,所以UTF-8需要对它进行编码。U+1F4A9在基本多语言平面之外,因此UTF-16用代理序列表示它。最后,U+201C不是以上任何一个。

以下是我们的候选字符在UTF-8、UTF-16LE和UTF-16BE中的表示。

<表类> 字符 utf - 8 th> UTF-16LE UTF-16BE tbody> <<tr> U + 0041 (a) 0 x41 td> 0 x41 0 x00 td> 0 x00 0 x41 td> tr> U + 00 e5 (a) 0 xc3 0 xa5 td> 0 xe5 0 x00 td> 0 x00 0 xe5 td> tr> U + 201 c () 0xE2 0x80 0x9C 0 x1c 0 x20 td> 0 x20 0 x1c td> tr> U + 1 f4a9(💩)0xF0 0x9F 0x92 0xA90x3D 0xD8 0xA9 0xDC0xD8 0x3D 0xDC 0xA9tbody>

最新更新