我听到了相互矛盾的意见,从人根据本 维基百科UTF-8 页。

他们是同样的东西,不是吗?有人可以澄清?

有帮助吗?

解决方案

要扩大对别人给予的答案:

我们有很多不同的语言,人物众多,电脑应该理想地显示。 Unicode的分配各字符的唯一编号或代码点。

计算机处理这样的数字为字节...这里跳过一些历史,而忽略内存寻址问题,8位计算机会像对待一个8位字节作为在硬件上,16位代表轻松的最大数值单位计算机将展开到两个字节,等等。

旧的字符编码如ASCII是从(预)8位的时代,并且尽量填满在时间中计算的主要语言,即英语,为数字范围从0到127(7位)。随着字母表中的26个字母,无论是在资本和非资本形式,数字和标点符号,那工作不错。 ASCII得到通过对其他非英语语言的第8位扩展,但这种扩张提供额外的128号/代码点将被映射到根据语言不同的字符显示。在ISO-8859标准是这种映射的最常见的形式; ISO-8859-1和ISO-8859-15(也称为ISO-Latin-1的,latin1的,并且是有两个不同版本的8859 ISO标准的为好)。

但是,当你想从一个以上的语言来表示字符,所以临时抱佛脚所有可用字符转换为一个字节是行不通这还不够。

基本上有两种不同类型的编码的:一个通过添加更多的比特扩展的数值范围。这些编码的例子是UCS2(2个字节= 16位)和UCS4(4个字节= 32位)。他们从本质上相同的问题,因为ASCII和ISO-8859标准吃亏,因为他们的取值范围仍然有限,即使限制是高得多。

在其他类型的编码使用可变数量的每个字符的字节,和最公知的编码此是UTF编码。所有UTF编码工作中大致相同的方式:选择一个单元的尺寸,这对于UTF-8为8位,对于UTF-16是16个比特,而对于UTF-32是32位。该标准然后定义几个这些位作为标志:如果他们设置,那么在为单位的序列中的下一个单元将被认为是相同的字符的一部分。如果他们没有设置,本机完全代表一个字符。因此,最常见的(英语)字符仅在UTF-8占据一个字节(两个UTF-16,4 UTF-32),但是其他语言的字符可占据六个字节或更多。

多字节编码(I应将上述说明后说多单元)具有的优点是它们相对空间有效,但不足之处在于,例如,查找子串,比较,等等的所有操作具有对字符进行解码为unicode码点可以执行这样的操作之前(有一些捷径,虽然)。

既可作为以Unicode定义的UCS标准和UTF标准编码所述代码点。从理论上讲,这些编码可用于编码任何数目(编码能够支持的范围内) - 但当然作了这些编码来编码的Unicode代码点。这就是它们之间的关系。

Windows处理所谓的“统一”的字符串作为UTF-16的字符串,而大多数UNIX系统默认为UTF-8这些天。通信协议,如HTTP往往工作最好使用UTF-8,如UTF-8的单元尺寸是相同的,如ASCII,和最这种协议被设计在ASCII时代。在另一方面,UTF-16给出了最好的平均空间/加工性能代表所有活的语言时。

Unicode标准定义了较少代码点比可以在32个比特表示。因此,对于所有的实际目的,UTF-32和UCS4成为相同的编码,因为你不可能有应对UTF-32多单元字符。

希望,在一些细节填充。

其他提示

不幸的是,根据上下文,“Unicode”有各种不同的使用方式。它最正确的用途(IMO)是作为 编码字符集 - IE。一组字符以及字符和整数之间的映射 代码点 代表他们。

UTF-8 是一种字符编码 - 一种从字节序列转换为字符序列的方法,反之亦然。它涵盖了整个 Unicode 字符集。ASCII 被编码为每个字符一个字节,其他字符根据其确切的代码点占用更多字节(对于所有当前定义的代码点,最多 4 个字节,即最大可达 U-0010FFFF,实际上 4 个字节可以应付最大 U-001FFFFF)。

当“Unicode”用作字符编码的名称时(例如作为.NET 编码.Unicode 财产)通常意味着 UTF-16, ,它将最常见的字符编码为两个字节。某些平台(尤其是 .NET 和 Java)使用 UTF-16 作为其“本机”字符编码。如果您需要担心无法用单个 UTF-16 值编码的字符(它们被编码为“代理对”),这会导致棘手的问题 - 但大多数开发人员从不担心这一点,IME。

关于 Unicode 的一些参考:

让我用一个例子来说明本主题:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

没有什么神奇的,到目前为止,这是非常简单的。现在,让我们说,我们决定将我们的存储硬盘上这个角色。要做到这一点,我们需要的字符以二进制格式存储。我们可以简单地存储它当作是“01101100 01001001”。完成!

但是且慢,是“01101100 01001001”的一个字符或两个字符?你知道这是一个角色,因为我告诉你,而是当计算机读取它,它根本不知道。因此,我们需要某种形式的“编码”,告诉计算机把它当作一个。

这是其中的规则 'UTF-8' 进来: HTTP:/ /www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

根据上面的表格,如果我们要使用“UTF-8”格式存储这个角色,我们需要一些“头”的前缀我们的性格。我们中国字是16位长(计数自己的二进制值),所以我们将使用格式3行,因为它提供了足够的空间:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

在一个行写入出来的结果:

11100110 10110001 10001001

这是中国字符的UTF-8(二进制)值! (你自己确认: http://www.fileformat.info/info /unicode/char/6c49/index.htm

摘要

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

P.S。如果您想了解在Python这个话题,点击这里

他们不是一回事 - UTF-8是编码的Unicode的一种特定的方式

有许多不同的编码,你可以从根据您的应用程序,您要使用的数据选择。最常见的是UTF-8,UTF-16和UTF-32号据我所知。

的Unicode只定义码点,即,其中一些代表一个字符。你如何在内存中,这些代码点存储依赖于的编码的您正在使用的。 UTF-8编码是在许多其他Unicode字符,的一种方式。

<强>的Unicode 是用于定义,与ISO / IEC 10646,的通用字符集(UCS)沿一个标准这是所有现有的字符,以几乎所有的代表所需要的超集已知的语言。

的Unicode分配一个名称和一个号码(汉字编码,或码点),以在其曲目的每个字符。

<强> UTF-8编码下,是在计算机存储器中的数字表示这些字符的方法。 UTF-8每个码点映射到的八位位组序列(8位字节)

有关如,

UCS字符= 的Unicode字符汉

UCS码点= U + 24B62

UTF-8编码= F0 A4 AD A2(十六进制)= 11110000 10100100 10101101 10100010(bin)中

Unicode 只是一个标准的定义的字符组(UCS)和编码(UTF)进行编码这个字符集。但在一般情况下,Unicode是引用的字符组,并不标准。

阅读 绝对最低限度的每一个软件开发人员绝对必须知道有关Unicode Character Sets(没有任何借口!)Unicode在5分钟.

在现有的答案已经解释了很多细节,但这里有最直接的解释,例如一个非常简短的回答。

<强> Unicode是所述的标准映射到字符码点。结果 每个字符都有一个唯一的码点(识别号码),它是像9731的数。

<强> UTF-8是一种 编码的码点。结果 为了在磁盘上存储的所有字符(在文件中),UTF-8字符分割为最多4个八位字节(8位序列) - 字节。 UTF-8是几个编码(表示数据的方法)中的一个。例如,以Unicode,所述(十进制)码点9731表示雪人(),它由3个字节以UTF-8:E2 98 83

下面是href="https://stackoverflow.com/a/23410670/664132">排序的列表的一些随机范例一个

1.统一码

世界上有很多字符,例如“$,&,h,a,t,?,张,1,=,+...”。

然后出现了一个致力于这些角色的组织,

他们制定了一个名为“Unicode”的标准。

标准如下:

  • 创建一个表单,其中每个位置称为“代码点”或“代码位置”。
  • 整个位置从U+0000到U+10FFFF;
  • 到目前为止,有些位置已被字符填满,而其他位置则被保存或为空。
  • 例如,位置“U+0024”用字符“$”填充。

PS:当然还有另一个叫ISO的组织维护着另一个标准——“ISO 10646”,几乎是一样的。

2.UTF-8

如上所述,U+0024只是一个位置,所以我们不能在计算机中为字符“$”保存“U+0024”。

必须有一种编码方法。

然后就出现了编码方法,例如UTF-8、UTF-16、UTF-32、UCS-2......

在UTF-8下,代码点“U+0024”被编码为00100100。

00100100是我们在计算机中保存的“$”值。

我已经检查在甘博的回答的联系,我想贴在这里的那些东西有些部分堆栈溢出存在的。

” ......有些人认为Unicode是一个简单的16位代码,其中每个字符需要16位,因此有65536个可能的字符误解之下。这不,其实,正确的。这是一个最常见有关Unicode的神话,所以如果你认为,不心疼。

事实上,Unicode有思考的字符以不同的方式,你必须要了解的东西或没有思想的统一方式将是有意义的。

到现在为止,我们已经假定了一封信映射到一些位,你可以在磁盘或存储在内存中:

A - > 0100 0001

在的Unicode,字母映射到一些所谓的码点,其仍然只是一个理论概念。如何的代码点在存储器中或磁盘上表示是一个整体的其他故事...“

” ...在每个字母的每个信柏拉图由被写成这样Unicode联盟分配一个幻数:U + 0639这幻数被称为码点的U +表示。‘的Unicode’以及数字是十六进制。U + 0639是阿拉伯字母Ain的。英文字母A将是U + 0041 ...。“

” ......好了,所以说,我们有一个字符串:

您好

其中,以Unicode,对应于这五个代码点:

U + 0048 U + 0065 U + 006C U + 006C U + 006F。

只是一串代码点。数字,真的。我们还没有谈到如何这个存储在内存或代表它在一封电子邮件中什么......“

” ......这就是编码进来了。

为Unicode编码,这导致约两个字节的神话,是,哎,让我们只存储这些数字中的每个的两个字节的最早的想法。所以的您好的变

00 48 00 65 00 6C 00 6C 00 6F

右?没有这么快!不能它也是:

48 00 65 00 6C 00 6C 00 6F 00? ......“

统一码 是一个范围广泛的标准,定义了超过 130,000 个字符并为每个字符分配一个数字代码(“代码点”)。它还定义了如何对文本进行排序、规范化、更改大小写等的规则。Unicode 中的字符由从 0 到 0x10FFFF(含)的代码点表示,但某些代码点是保留的并且不能用于字符。

Unicode 中的代码可以用多种编码来表示。最简单的是 UTF-32,它将代码点简单地编码为 32 位整数,每个整数有 4 个字节宽。

UTF-8 是另一种编码,并迅速成为事实上的标准。它编码为字节值序列。每个代码点可以使用可变数量的这些字节。ASCII 范围内的代码点采用裸编码,以便与 ASCII 兼容。此范围之外的代码点使用可变数量的字节,可以是 2、3 或 4,具体取决于它们所在的范围。

UTF-8 在设计时考虑了以下属性:

  • ASCII 字符的编码与 ASCII 中的编码完全相同,因此 ASCII 字符串也与 UTF-8 一样有效。

  • 二进制排序:使用简单的二进制排序对 UTF-8 字符串进行排序仍会导致所有代码点按数字顺序排序。

  • ASCII 范围之外的字符不使用 ASCII 范围内的任何字节,确保它们不会被误认为是 ASCII 字符。这也是一项安全功能。

  • UTF-8 可以很容易地通过验证器进行验证,并与其他字符编码区分开来。其他 8 位或多字节编码的文本很少也被验证为 UTF-8。

  • 随机访问:在 UTF-8 字符串中的任何一点,都可以判断该位置的字节是否是字符的第一个字节,并回溯到该字符的开头,而无需引用开头的任何内容。字符串。

它们是同一件事,不是吗?

不,他们不是。


我认为第一句话 维基百科页面 您引用的内容给出了一个很好的简短摘要:

UTF-8 是一种可变宽度字符编码,能够使用一到四个 8 位字节对 Unicode 中的所有 1,112,064 个有效代码点进行编码。

详细说明:

  • 统一码 是一个标准,它定义了 从字符映射到 数,即所谓的 代码点, ,(如下例所示)。对于完整的映射,你可以看看 这里.

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 是对这些代码点进行编码的方法之一 计算机可以理解的形式,又名 . 。换句话说,它是一种将每个代码点转换为比特序列或将比特序列转换为等效代码点的方法/算法。请注意,Unicode 有很多替代编码。


乔尔给出了非常好的解释和历史概述 这里.

<强> UTF-8 是用于编码使用8位序列Unicode字符的方法。

<强>的Unicode 是从许多语言表示种类繁多的字符的标准。

如果我可以总结一下我从这个线程收集:

的Unicode '平移' 的字符序数(以十进制形式)

à = 224

UTF-8是 '平移' 的这些数字为二进制编码的表示

224 = 11000011 10100000
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top