io:fread for Unicode 字符不适用于 -noshell



我正在尝试使用 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]]}

最新更新