我正在尝试使用 io:fread
读取 unicode 字符(超出 latin1 范围)。
下面的代码在 shell 模式下工作正常:
Eshell V5.10.4 (abort with ^G)
1> io:fread("Input some Unicode characters: ", "~ts").
Input some Unicode characters: 呵呵
{ok,[[21621,21621]]}
但是,使用 -noshell
标志时,它会返回另一个列表:
$ erl -noshell -eval "io:format("~p", [io:fread("Input: ", "~ts")])."
Input: 呵呵
{ok,[[229,145,181,229,145,181]]}
有谁知道它为什么会这样?
来自 erlang 文档,
当 Erlang 以 -oldshell 或 -noshell 启动时,I/O 服务器 standard_io默认设置为字节编码,而交互式 shell 默认为环境变量所说的内容
使用 io:setopts/2 函数,您可以设置文件的编码或 其他 I/O 服务器...
因此,应添加如下io:setopts/2
;
$ erl -noshell -eval "io:setopts(standard_io, [{encoding, unicode}]), io:format("~p", [io:fread("Input: ", "~ts")])."
Input: 呵呵
{ok,[[21621,21621]]}