Erlang 正确使用unicode字符

Erlang 正确使用unicode字符,erlang,otp,Erlang,Otp,我正在尝试使用任何类型的字符保存二进制文件,例如: $ 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 = <<" H

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

$  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> 
$LC\u CTYPE=en\u US.UTF-8 erl
Erlang/OTP 20[erts-9.2][source][64位][smp:8:8][ds:8:8:10][async threads:10][hipe][kernel poll:false][dtrace]
Eshell V9.2(使用^G中止)
1> TextBinaryWithSpecialChar=。
2> 
如何让它保存我想要的:

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

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

5> <<97,98,99>>.
<<"abc">>
5>。
shell是否显示字符或数字与此无关:

6> <<97,98,99>> == <<"abc">>.
true
6>==。
符合事实的

由于Erlang会将二进制文件中的值截断为字节(除非另有规定),所以“右单引号”的可能重复项变为25。它的代码点是U+2019,所以它被截断为
16#19
,等于25。@Legossia,这不是用数字而不是字节来截断吗?2019的二进制格式为:
0000 0111 1110 0011
。我不知道如何截断它——不管你以何种方式分割它——会得到
0001 1001
(或25)。2019是十六进制的,所以
0010 0000 0001 1001
是二进制的。@legoscia,
2019是十六进制的
-谢谢。
5> <<97,98,99>>.
<<"abc">>
6> <<97,98,99>> == <<"abc">>.
true