erlang os:cmd() 命令与 UTF8 二进制文件
erlang os:cmd() command with UTF8 binary
我正在尝试获取一个 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
命令会创建具有正确名称的文件。
这是因为默认情况下 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ł
我正在尝试获取一个 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
命令会创建具有正确名称的文件。
这是因为默认情况下 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ł