我问谷歌上面的问题,被发送到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中的表示。