erlang os:带有UTF8二进制文件的cmd()命令

时间:2015-06-09 07:32:36

标签: unicode encoding erlang utf

我正在尝试使用Erlang函数来执行包含unicode字符的bash命令。例如,我想执行相当于:

touch /home/jani/ჟანიweł

我将该命令放在变量D中,例如:

io:fwrite("~ts", [list_to_binary(D)]).                                                                       
touch /home/jani/ჟანიwełok

但在执行之后:

os:cmd(D)

我得到名为á??á??á??á??weÅ?的文件。我该如何解决?

os:cmd(binary_to_list(unicode:characters_to_binary("touch /home/jani/编程"))).

执行此命令会创建一个名为ç¼?ç¨?的文件,而在终端中直接执行等效的touch命令会创建具有正确名称的文件。

1 个答案:

答案 0 :(得分:3)

因为Erlang默认会读取你的源文件,比如latin1,但是在较新版本的erlang上你可以设置你的文件使用unicode。

%% coding: utf-8

-module(test).
-compile(export_all).

test() ->
    COMMAND = "touch ჟანიweł",
    os:cmd(COMMAND).

然后编译并执行模块工作正常

rorra-air:~ > erl
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V6.4  (abort with ^G)
1> c(test).
{ok,test}
2> test:test().
[]

它在我的文件系统上创建了文件

rorra-air:~ > ls -lta
total 144
-rw-r--r--   1 rorra  staff      0 Jun  9 15:18 ჟანიweł