Encoding UTF-16与UTF-8兼容吗?

Encoding UTF-16与UTF-8兼容吗?,encoding,utf-8,utf-16,Encoding,Utf 8,Utf 16,我问了谷歌上面的问题,结果被发送到谷歌,可惜谷歌没有回答这个问题 根据我的理解,UTF-8应该是UTF-16的子集,这意味着:如果我的代码使用UTF-16,并且我交上一个UTF-8编码字符串,那么一切都应该是好的。另一种方法(期望UTF-8和获得UTF-16)可能会导致问题 对吗 编辑:澄清为什么链接的SO问题没有回答我的问题:我的问题是在尝试使用WebClient.DownloadString处理JSON字符串时出现的,因为WebClient使用了错误的编码。我从请求中收到的JSON编码为UT

我问了谷歌上面的问题,结果被发送到谷歌,可惜谷歌没有回答这个问题

根据我的理解,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.unicodeincoding
(又称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是一种字节编码,因此不具有endianness。)传统UTF-16过去被限制为65536个可能的字符,这比Unicode当前包含的字符少。这是通过代理来处理的,但是真正旧的和/或损坏的UTF-16实现(正确地标识为UCS-2,而不是“真正的”UTF-16)不支持它们

具体来说,让我们比较四个不同的代码点。我们选择、和,因为它们很好地说明了差异

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

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

Character | UTF-8               | UTF-16LE            | UTF-16BE            |
----------+---------------------+---------------------+---------------------+
U+0041    | 0x41                | 0x41 0x00           | 0x00 0x41           |
U+00E5    | 0xC3 0xA5           | 0xE5 0x00           | 0x00 0xE5           |
U+201C    | 0xE2 0x80 0x9C      | 0x1C 0x20           | 0x20 0x1C           |
U+1F4A9   | 0xF0 0x9F 0x92 0xA9 | 0x3D 0xD8 0xA9 0xDC | 0xD8 0x3D 0xDC 0xA9 |
举一个明显的例子,如果将U+00E5的UTF-8编码解释为UTF-16(在UTF-16LE中是,在UTF-16BE中是),则表示完全不同的字符。相反,许多UTF-16编码根本不是有效的UTF-8序列。所以从这个意义上讲,UTF-8和UTF-16是完全不兼容的

这些是字节值;在ASCII中,0x00是NUL字符(有时表示为
^@
),0x41是大写字母A,0xE5是未定义的;例如,在拉丁语中,in代表字符å(在Unicode中也可以方便地称为U+00E5),但在KOI8-R中,in代表西里尔字符å()


在现代编程语言中,您的代码应该简单地使用Unicode,并让该语言以适合您的平台和库的方式处理编码的细节。请注意,另请参见

否。它们不兼容。您所说的“交上来”是什么意思?它们对同一组字符进行编码,但如果UTF-8中的字节序列被解释为UTF-16,则它将不代表同一组字符。如果你能提供更多关于你想做什么的细节,那会很有帮助。可能重复的是“不”,那是不正确的。并非所有UTF-8编码的字节都是有效的UTF-16字节,反之亦然。没有办法选择能够同时处理这两个问题的正确编码;你需要知道你输入的编码并相应地处理它。看看你链接到的问题,那里的答案基本上告诉你这一点。我将提名以重复的方式结束你的问题。我非常不同意:很明显,有人问“UTF-8是UTF-16的子集吗?”答案显然是“否”。