为什么unicode必须使用utf-8?

为什么unicode必须使用utf-8?,unicode,encoding,Unicode,Encoding,据我所知,UNICODE是字符映射的行业标准 我不明白的是为什么它必须通过UTF-8编码,而不是直接作为Unicode编码 比如字母a,为什么不能存储为U+0061作为值的字符串,并且必须存储为八进制0061 我说得通吗?UTF-8只是Unicode的一种“内存格式”。还有UTF-16、UTF-32和许多其他内存映射格式 UTF-8已被广泛使用,因为它与Ascii等8位字符代码向上兼容 您可以通过html、mySQL和Notepad++vie编码选项告诉浏览器使用其他格式的数据 DuckDuck

据我所知,UNICODE是字符映射的行业标准

我不明白的是为什么它必须通过UTF-8编码,而不是直接作为Unicode编码

比如字母a,为什么不能存储为U+0061作为值的字符串,并且必须存储为八进制0061


我说得通吗?

UTF-8只是Unicode的一种“内存格式”。还有UTF-16、UTF-32和许多其他内存映射格式

UTF-8已被广泛使用,因为它与Ascii等8位字符代码向上兼容

您可以通过html、mySQL和Notepad++vie编码选项告诉浏览器使用其他格式的数据

DuckDuckGo或谷歌Unicode,你会在互联网上找到很多关于这方面的文章。这里有一个:

谁说它必须编码为UTF-8?Unicode有几种常见的编码,包括UTF-16大端或小端,以及一些不太常见的编码,如和UTF-32

Unicode本身不是一种编码;它只是数千个字符的数字代码点规范

小写字母a的Unicode代码点是十六进制的0x61、十进制的97或八进制的0141

如果您建议将“a”编码为6个字符的ASCII字符串U+0061,这将非常浪费空间,并且比UTF-8更难解码

如果您建议直接存储数值,UTF-32就是这样做的:它将每个字符存储为直接表示代码点的32位4八位数字。问题是它几乎和U+0061一样浪费空间,每个字符4字节,而不是6字节

UTF-8编码有许多优点。一是它向上兼容ASCII码。另一个原因是,即使对于非ASCII字符,只要大部分编码文本在前几千个代码点内,它也相当有效

UTF-16还有其他一些优点,但我个人更喜欢UTF-8。MS Windows倾向于使用UTF-16,但主要是出于历史原因;当定义的代码点少于65536个时,Windows增加了Unicode支持,这使得UTF-16与UCS-2等价,后者是一种更简单的表示形式

比如字母a,为什么不能存储为U+0061作为值的字符串

存储的数据是字节值序列,通常在最低级别解释为数字。我们通常使用的字节可以是256个值中的一个,因此我们将它们视为0到255范围内的数字

那么,当你说“只是存储为一个U+0061的字符串”时,你指的是0-255范围内的数字序列

像U+0061这样的Unicode代码点是用十六进制编写的。十六进制61是更熟悉的十进制系统中的数字97,因此您可能认为字母“a”应存储为一个值为97的单字节。您可能会惊讶地发现,编码UTF-8就是这样表示这个字符串的

当然,Unicode中定义的字符超过256个,因此并非所有Unicode字符都可以存储为字节,其值与其Unicode代码点相同。UTF-8有一种处理方法,还有其他不同的编码方法

例如,UTF-32是一种一次使用4个字节来表示一个码点的编码。因为一个字节有256个值,所以四个字节可以有256×256×256×256或4294967296不同的排列。我们可以将这些字节排列从0到4294967295进行编号,然后将每个Unicode代码点存储为我们用对应于Unicode代码点值的数字编号的字节排列。这正是UTF-32所做的

然而,有不同的方式为四字节的排列分配数字,因此有多个版本的UTF-32,如UTF-32BE和UTF-32LE。通常,存储或传输字节的特定介质指定其自己的编号方案,无需进一步限定的编码“UTF-32”意味着应使用该介质的本机方案。

阅读本文:

我说得通吗

不多!继续读

据我所知,UNICODE sic是字符映射的行业标准

这是不正确的。Unicode不是字符映射的标准。它是一个定义一组字符代码及其含义的标准

它本质上是一个目录,定义了Unicode代码点到概念字符的映射,但它不是映射字符的标准。它当然没有定义表示代码点的标准方式;i、 e.到表示的映射。这就是字符编码方案所做的

我不明白的是为什么它必须通过UTF-8编码,而不是直接作为Unicode编码

这是不正确的。字符数据不必用UTF-8编码。它可以是e 编码为UTF-8。但它也可以通过其他多种方式编码:

Unicode指定了许多编码方案,包括UTF-8、UTF-16和UTF-32以及各种历史变体

还有许多其他的标准编码方案,可能有数百种。这是维基百科的页面列表

不同的编码方案有不同的目的和限制。例如:

ASCII和LATIN-1分别是7位和8位字符集,对Unicode码点的一小部分进行编码。ASCII编码罗马字母和数字、一些标点符号和控制代码。LATIN-1添加了一些在西欧使用的重音拉丁字母和一些其他常见的印刷字符

UTF-8是一种可变长度编码方案,将Unicode代码点编码为1到5字节的八位字节。它偏向于西方用法。。。因为它将所有拉丁/罗马字母和数字编码为单个字节

UTF-16设计用于以16位单位编码Unicode码点。Java字符串本质上是UTF-16编码的

比如字母a,为什么不能存储为U+0061作为值的字符串,并且必须存储为八进制0061

事实上,Java字符串表示为一系列字符值。char类型是16位无符号整数类型;i、 e.其值为0到65535。表示小写字符a的字符值为十六进制0061==八进制141==十进制97


你对八进制0061的看法是错误的。。。但我不知道你们到底想在这里做出什么区别,所以我不能对此发表评论

Unicode不必使用UTF-8。还有其他可能的编码方案。你在哪里读到UTF-8是唯一的选择?而且,它使用更少的内存来存储UTF-8而不是Unicode 0061是“a”的十六进制表示,而不是八进制表示。大多数与Unicode相关的文档都使用十六进制。阅读无耻插件:-谢谢,您提供的链接也非常有用。但我只能选择一个答案。不过我给你分。