io:unicode字符的fread不能与-noshell一起使用

时间:2015-01-15 10:19:52

标签: erlang

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

有谁知道它为什么会这样?

1 个答案:

答案 0 :(得分:2)

来自erlang documentation

  

当Erlang以-oldshell或-noshell启动时,I / O服务器为   standard_io默认设置为bytewise编码,而交互式   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]]}