我正在尝试使用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]]}
有谁知道它为什么会这样?
答案 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]]}