【问题标题】:Use unicode characters correctly正确使用 unicode 字符
【发布时间】:2019-03-08 01:46:43
【问题描述】:

我正在尝试使用任何类型的字符保存二进制文件,例如:

$  LC_CTYPE=en_US.UTF-8 erl
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V9.2  (abort with ^G)
1> TextBinaryWithSpecialChar =  <<" Hey, If you’re down, I’m here to help">>.                    
<<32,72,101,121,44,32,73,102,32,121,111,117,25,114,101,32,
  100,111,119,110,44,32,73,25,109,32,104,101,114,...>>
2> 

我怎样才能让它保存我想要的东西:>

【问题讨论】:

标签: erlang erlang-otp


【解决方案1】:
1> <<"you’re"/utf8>>. 
<<121,111,117,226,128,153,114,101>>

在 UTF-8 中,一个“右单引号”由三个字节表示:

             Hex 
          Notation
           -------
1st byte:    E2 => E=14    2 
                   1110  0010 = 226

2nd byte:    80 =>  8     0
                   1000  0000 = 128

3rd byte:    99 =>  9     9
                   1001  1001 = 153

当您没有为二进制文件指定 utf8 时,我不知道 erlang 如何为“右单引号”获取 25。 (14 + 2 + 9 = 25?)

在 erlang 中,"abc" 只是列表 [97,98,99] 的快捷方式,与二进制文件类似:

5> <<97,98,99>>.
<<"abc">>

shell显示字符还是数字无关:

6> <<97,98,99>> == <<"abc">>.
true

【讨论】:

  • “右单引号”变为 25,因为除非另有说明,否则 Erlang 会将二进制文件中的值截断为字节。它的代码点是 U+2019,所以它被截断为 16#19,等于 25。
  • @legoscia,这不会被数字截断——不是字节吗? 2019 的二进制是:0000 0111 1110 0011。我看不出如何截断它——不管你怎么切——会得到0001 1001(或25)。
  • 2019 是十六进制的,所以 0010 0000 0001 1001 是二进制的。
  • @legoscia, 2019 is in hex - 谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-12-16
  • 2012-08-08
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2016-07-04
相关资源
最近更新 更多