赞
踩
在“基本类型”中,我们学习了一些关于字符串的知识,并使用 is_binary/1 函数进行检查:
iex>string = "hello"
"hello"
iex>is_binary(string)
true
在本章中,我们将明确二进制到底是什么、它们与字符串的关系以及 Elixir 中单引号值“like this”的含义。虽然字符串是计算机语言中最常见的数据类型之一,但它们却非常复杂,经常被误解。要理解 Elixir 中的字符串,我们必须了解 Unicode 和字符编码,特别是 UTF-8 编码。
为了促进跨多种语言的计算机之间的有意义的通信,需要一个标准,以便一台机器上的 1 和 0 在传输到另一台机器时具有相同的含义。Unicode 标准充当了我们所知道的几乎所有字符的官方注册表:这包括来自古典和历史文本的字符、表情符号以及格式和控制字符。
Unicode 将其库中的所有字符组织成代码表,每个字符都被赋予一个唯一的数字索引。这个数字索引称为码位。
---------------------------------------------------------------------------------------------------------------------------------
在字符编码术语中,码位或称编码位置,即英文的code point或code position,是组成码空间(或代码页)的数值。 例如,ASCII码包含128个码位,范围是016进制到7F16进制,扩展ASCII码包含256个码位,范围是016进制到FF16进制,而Unicode包含1,114,112个码位,范围是016进制到10FFFF16进制。Unicode码空间划分为17个Unicode字符平面(基本多文种平面,16个辅助平面),每个平面有65,536(= 216)个码位。因此Unicode码空间总计是17 × 65,536 = 1,114,112.
定义
码位的抽象意涵, 不同于下列概念:
1.作为具体编码的比特流。例如,UTF-16编码的比特流,既可以是大尾序,也可以是小尾序。
2.具有特定字形的字符. 因为字符集中的字符(码位)的具体外观随字体(font)——字体显示样式——的不同而变化。
3.特定码空间的编码方式。例如,一个Unicode码空间的码位,可以用UTF-8编码;也可以用UTF-16编码。
4.用不同字形显示一个字符,即字位.
---------------------------------------------------------------------------------------------------------------------------------
在 Elixir 中,您可以在字符文字前使用 ? 来显示其码位:
iex>?a
97
iex>?ł
322
请注意,大多数 Unicode 代码表将通过其十六进制 (hex) 表示来引用码位,例如97转换为十六进制的0061,我们可以使用 \uXXXX 符号和其码位号的十六进制表示来表示 Elixir 字符串中的任何 Unicode 字符:
iex>“\u0061”==“a”
true
iex>0x0061 = 97 = ?a
97
十六进制表示还可以帮助您查找有关码位的信息,例如 https://codepoints.net/U+0061 有一个关于小写字母 a(又名码位 97)的数据表。
现在我们了解了什么是 Unicode 标准以及什么是码位,我们终于可以讨论编码了。码位是我们存储的内容,而编码则涉及我们如何存储它:编码是一种实现。换句话说,我们需要一种机制将码位数字转换为字节,以便它们可以存储在内存中、写入磁盘等。
Elixir 使用 UTF-8 对其字符串进行编码,这意味着码位被编码为一系列 8 位字节。UTF-8 是一种可变宽度字符编码,使用一到四个字节来存储每个码位。它能够对所有有效的 Unicode码位进行编码。让我们看一个例子:
iex>string = "héllo"
"héllo"
iex>String.length(string)
5
iex>byte_size(string)
6
虽然上面的字符串有 5 个字符,但它使用了 6 个字节,因为使用两个字节来表示字符 é。
注意:如果您在 Windows 上运行,您的终端可能默认不使用 UTF-8。您可以在输入 iex (iex.bat) 之前运行 chcp 65001 来更改当前会话的编码。
除了定义字符外,UTF-8 还提供了字素的概念。字素可能由多个通常被视为一个的字符组成。例如,女消防员表情符号表示为三个字符的组合:女性表情符号 (
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。