对于IoDevices,可以使用io:getopts/1
作为示例,但我找不到任何普通字符串的方法。
例如,
ManPage = os:cmd("man ls").
% [76,83,40,49,41,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
% 32,32,32,32,32,32,32,32,32,32|...]
io:format("~p~n",[ManPage]).
% [76,83,40,49,41,(...)
io:format("~ts~n",[ManPage]).
% LS(1) User Commands LS(1)
% NAME
% ls - list directory contents
文档on using Unicode in Erlang仅提及启发式方法,但它可能已过时,因为根据示例io_lib:format/2
,~ts
控制字符会产生utf-8输出。尝试使用Erlang 18.0:
Bullet = "\x{2022}".
% [8226]
io:format("~ts~n", [Bullet]).
% •
% ok
io:format("~ts~n", ["•"]).
% •
% ok
io_lib:format("~ts~n", [Bullet]).
% [[8226],"\n"]
我知道我可以使用unicode:characters_to_binary/{1,2,3}
,因为它接受latin1或utf8编码输入并吐出unicode编码输出但我很好奇,如果有另一种方式。
有趣的是,unicode:characters_to_binary/1
工作正常而unicode:characters_to_list/1
没有(或者我误用它)。
unicode:characters_to_binary(ManPage).
% <<"LS(1) User Commands LS(1)\n\n\n\nNAME\n "...>>
unicode:characters_to_list(ManPage).
% [76,83,40|...]
unicode:characters_to_list(ManPage, latin1).
% {error,"LS(1) User Commands LS(1",
[8208,10,32|...]}
答案 0 :(得分:4)
遗憾的是,只有启发式方法可以确定字符编码。有一个简短的解释为什么here。
也就是说,在上面指定的特定情况下,真正的问题是系统(而不是Erlang)shell的编码是什么。我们可以通过直接检查环境来找到它(虽然这将是一个特定于平台的解决方案 - 我是从使用Bash的Debian派生系统编写的):
1> LANG = os:cmd("echo $LANG").
"ja_JP.UTF-8\n"
2> {_, Enc} = lists:split(6, LANG).
{"ja_JP.","UTF-8\n"}
3> Encoding = string:strip(Enc, right, $\n).
"UTF-8"
然而,这是一个相当废话的解决方案。它完全不可移植,并且无法保证您的环境实际遵循规则并将5个字符的语言/区域,然后是点,然后将编码放入其$LANG
环境变量中。我很确定这不起作用,例如,至少在某些版本的Solaris上,在AIX上,我认为获得编码的方法是检查$LC_CTYPE
或类似的东西(或者那可能是向后......或者......看,我甚至不记得对这个的怪癖这一事实足以表明这是不可靠的。)
另一种方法是使用locale
命令并让它直接为您提供字符集:
4> os:cmd("locale charmap").
"UTF-8\n"
这个尾随的换行令我讨厌,所以......
5> string:strip(os:cmd("locale charmap"), right, $\n).
"UTF-8"
也就是说,locale
命令在任何地方都不存在。在任何情况下,检查来自环境的语言环境输出数据和环境变量的某种组合应该可以解决问题,但为了使其可移植,您需要通过几种方法来操作系统。幸运的是,大多数系统现在默认为utf8,但Windows除外,但至少Windows 主要是内部标准化。
(如果您专门处理手册页...请记住,手册页中嵌入了控制字符以进行标记,因此虽然手册页的纯文本输出将是您所期望的,由man
解释的实际联机帮助页数据已标记。根据您的操作,可能更容易直接操作联机帮助页存档数据。)
答案 1 :(得分:2)
不清楚我们在谈论什么编程语言,但没有这样的方法。
您可以要求用户设置环境变量LC_ALL / LC_CTYPE / LANG以匹配数据,但无法确定它们是否真的这样做。
更重要的是,你的程序可能必须在同一程序运行中处理不同的编码(例如来自不同的文件),所以你要么使用一些启发式来猜测编码(期待麻烦!),或者给用户一个方法指定编码 - 就像文本编辑器在打开文件时所做的那样。