【发布时间】:2018-07-02 17:32:46
【问题描述】:
查看 Elixir 对 unicode 的处理:
iex> String.codepoints("abc§")
["a", "b", "c", "§"]
非常好,其中的 byte_size/2 不是 4 而是 5,因为最后一个 char 占用 2 个字节,我明白了。
?运算符(或者它是一个宏?找不到答案)告诉我
iex(69)> ?§
167
太棒了;然后我查看 UTF-8 编码表,并将值 c2 a7 视为 char 的十六进制编码。这意味着两个字节(由 byte_size/1 见证)是 c2(十进制的 94)和 a7(十进制的 167)。 167 是我之前评估 ?§ 时得到的结果。确切地说,我不明白的是..根据 ? 运算符的描述,为什么该数字是“代码点”。当我尝试向后工作并评估二进制文件时,我得到了我想要的:
iex(72)> <<0xc2, 0xa7>>
"§"
为了让我彻底疯了,这就是我在 Erlang shell 中得到的:
24> <<167>>.
<<"§">>
25> <<"\x{a7}">>.
<<"§">>
26> <<"\x{c2}\x{a7}">>.
<<"§"/utf8>>
27> <<"\x{c2a7}">>.
<<"§">>
!!虽然 Elixir 只对上面的代码感到满意......我不明白的是什么?为什么 Erlang 对单个字节非常满意,因为 Elixir 坚持认为 char 需要 2 个字节 - 而 Unicode 表似乎也同意?
【问题讨论】:
-
看起来 Erlang 将二进制的字节打印为 latin1 编码字符,而 Elixir 将它们视为 ASCII。
-
要了解 Erlang shell 中发生了什么,您需要知道您使用的是哪个版本的 Erlang(但任何最近的版本都应该使用 Unicode),您的语言环境设置是什么(LANG,LC_ *) 以及您的终端设置使用的编码。从您的示例看来,您使用的是非 unicode 语言环境,并且终端打印 latin-1。