gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:25:25 28 4
gpt4 key购买 nike

我问Google上面的问题,然后被发送到Difference between UTF-8 and 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+0041U+00E5U+201CU+1F4A9,因为它们很好地说明了差异。

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中为 U+A5C3,在UTF-16BE中为 U+C3A5),则表示一个完全不同的字符。 UTF-16代码中的全部根本不是有效的UTF-8序列。因此,从这个意义上讲,UTF-8和UTF-16是完全不兼容的。

这些是字节值;在ASCII中,0x00是NUL字符(有时表示为 ^@),0x41是大写A,而0xE5未定义;例如Latin-1 in表示字符å(在Unicode中也方便地为U + 00E5),但是在KOI8-R中,它是西里尔字母Е( U+0415), etc.

在现代编程语言中,您的代码应仅使用Unicode,并让该语言以适合您的平台和库的方式处理对其进行编码的细节。关于切线注意,另请参见 http://utf8everywhere.org/

关于encoding - UTF-16与UTF-8兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32499846/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com