首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种非启发式的方法来查找字符串的编码(即。清单)?

是否有一种非启发式的方法来查找字符串的编码(即。清单)?
EN

Stack Overflow用户
提问于 2015-08-17 00:43:13
回答 2查看 158关注 0票数 3

例如,对于IoDevices,可以使用io:getopts/1,但我找不到任何普通字符串的方法。

例如,

代码语言:javascript
复制
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

文档论Erlang中Unicode的使用只提到了一些启发式的方法,但是它可能已经过时了,因为根据示例,带有~ts控制字符的io_lib:format/2会产生utf-8输出。试着用Erlang 18.0:

代码语言:javascript
复制
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不工作(或者我在滥用它)。

代码语言:javascript
复制
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|...]}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-17 04:35:50

不幸的是,只有启发式的方法来确定字符编码。有一个简短的解释为什么这里

也就是说,在上面指定的特定情况下,真正的问题是将系统(而不是Erlang) shell设置为什么编码。我们可以通过直接检查环境(尽管这将是一个特定于平台的解决方案-我是从使用Bash的Debian派生系统中编写这个解决方案)来发现这个问题的:

代码语言:javascript
复制
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命令并让它直接给出字符集:

代码语言:javascript
复制
4> os:cmd("locale charmap").
"UTF-8\n"

我很讨厌这条新闻线路,所以.

代码语言:javascript
复制
5> string:strip(os:cmd("locale charmap"), right, $\n).
"UTF-8"

也就是说,locale命令并不是无处不在的。在任何情况下,从环境和环境变量中检查区域设置输出数据的组合都可以做到这一点,尽管要使其可移植,您需要用几种方法来武装您的系统。幸运的是,除了Windows之外,大多数系统现在默认为utf8,但至少Windows大多是内部标准化的。

(如果你专门处理手册页.请记住,手册页中嵌入了用于标记的控制字符,因此,虽然只有文本的手册页输出将如您所期望的那样,但由man解释的实际手册页数据将被标记出来。根据您正在做的事情,直接操作手册归档数据可能更容易。)

票数 4
EN

Stack Overflow用户

发布于 2015-08-17 09:19:42

不清楚我们在说什么编程语言,但没有这样的方法。

您可能会要求用户设置环境变量LC_ALL/LC_CTYPE/LANG来匹配数据,但不能确定他们确实这样做。

更重要的是,您的程序可能必须在同一个程序中处理不同的编码-运行(例如来自不同的文件),所以您可以使用一些启发式来猜测编码(预期麻烦!),或者给用户一种方法来指定类似编码的文本编辑器在打开文件时所做的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32041354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档