解决erlang R17无法识别中文问题

erlang更新到R17已有一段时间了,公司项目打算从旧版的erlang迁移到R17,却不料有不少的困扰,其中一个问题是中文问题。

这个问题很容易重现:新建一个文件t.erl,保存为utf-8无bom格式

-module(t).
-export([test/0]).
test() ->
	["我", <<"我">>].

在旧版的erlang中,下面的代码能正常工作,结果就是:

Eshell V5.9.1 (abort with ^G)
1> c(t).
{ok,t}
2> t:test().
[[230,136,145],<<230,136,145>>]

R17编译后的运行结果为:

Eshell V6.0 (abort with ^G)
1> c(t).
{ok,t}
2> t:test().
[[25105],<<17>>]

找到erlang的文档,erlang更新到R17后,默认编码从Latin-1换成了utf8

In Erlang/OTP 17.0, the encoding default for Erlang source files was switched to UTF-8 and in Erlang/OTP 18.0 Erlang will support atoms in the full Unicode range, meaning full Unicode function and module names

想让R17正确识别utf-8无bom格式的代码文件,方法就是在文件头部加上“%% coding: latin-1”,代码就变成这样:

%% coding: latin-1
-module(t).
-export([test/0]).
test() ->
      ["我", <<"我">>].

问题是,写个脚本对旧的代码文件做修改虽然不麻烦,但新加进来的文件还要加上这个头部申明,确定有点坑爹。而且受影响的还有 file:consult/1 ,也是要加上头部申明

最脑裂的是erlang没有提供启动参数,用来支持原来的latin-1模式。试过了erl +pc latin1还是无法解决问题,这里不知道是不是bug

所以,这里在erlang基础上重新实现erlang的编译,代码如下:

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

compile(FileName) ->
	compile(FileName, [verbose,report_errors,report_warnings]).

compile(FileName, Options) ->
	Module = filename:basename(FileName),
	{ok, Forms } = epp:parse_file(FileName, [{default_encoding, latin1}]) ,
	{ok, Mod, Code} = compile:forms(Forms, Options),
	{ok, Cwd} = file:get_cwd(),
	code:load_binary(Mod, FileName, Code),
	file:write_file(lists:concat([Cwd, Module, ".beam"]), Code, [write, binary]).

注意了,以上代码不要在R17之前erlang使用,某些接口erlang还没提供支持。运行结果如下:

14> c(test).
{ok,test}
15> test:compile("t.erl").
ok
16> t:test().
[[230,136,145],<<230,136,145>>]

另外,也重新实现了file:consult/1,如下:

consult(File) ->
	case file:open(File, [read]) of
	{ok, Fd} ->
		R = consult_stream(Fd),
		_ = file:close(Fd),
		R;
	Error ->
		Error
	end.

consult_stream(Fd) ->
	_ = epp:set_encoding(Fd, latin1),
	consult_stream(Fd, 1, []).

consult_stream(Fd, Line, Acc) ->
	case io:read(Fd, ‘‘, Line) of
	{ok,Term,EndLine} ->
		consult_stream(Fd, EndLine, [Term|Acc]);
	{error,Error,_Line} ->
		{error,Error};
	{eof,_Line} ->
		{ok,lists:reverse(Acc)}
	end.

虽然这里能解决erlang R17无法识别中文问题, 但还是希望erlang在以后的版本能提供一个参数用以兼容latin的代码。

参考:http://blog.csdn.net/mycwq/article/details/40718281

时间: 2024-12-20 20:37:38

解决erlang R17无法识别中文问题的相关文章

Atitit.404错误解决标准流程and url汉字中文路径404错误resin4 resin chinese char path 404 err解决

Atitit.404错误解决标准流程and url汉字中文路径404错误resin4 resin chinese char path 404 err解决 1. #原因解析 1 2. #解决方式 2 3. 输出图片流... 2 4. --code 2 5. 参考 3 1. #原因解析 查看累挂发送d url,,,俄使用的是ff..它把url转换成个 http://localhost/img/QQ%E6%88%AA%E5%9B%BE20140401175433.jpg 发送出去..每汉字3个%字符,

Fiddler_解决Fiddler查看Post参数中文乱码的问题

解决Fiddler查看Post参数中文乱码的问题 今天一个同事问我,为什么用Fiddler查看Post的中文参数,是一堆乱码,如下: 需要在注册表中增加一个键值: HKEY_CURRENT_USER\Software\Microsoft\Fiddler2\HeaderEncoding 设置值为gb2312即可,如下图: 大功告成:)

解决出现乱码substr截取中文字符 siluke123

siluke123< ?php echo mb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');?>输出:这样一来我的字< ?phpecho mb_strcut('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');?>输出:这样 string mb_strcut ( string $str , int $start [, int $length [, string $encoding ] )mb_strcut() 和 m

erlang R17新socket选项{active,N}

erlang R17带来了新的socket选项{active,N} ,与{active,once}一起为应用层提供流量控制.为什么要多了这个选项,{active,once}不是可以有效抑制大量socket消息吗? 我们知道,{active,once}在每次接收到包都要重新设置active选项,才能继续接收erlang的消息通知.实际上,每次设定{active,once}都意味着调用一次epoll_ctl, 如果请求过于频繁,就会有大量的epoll_ctl调用.erlang目前只有一个线程会收割e

完美解决 Linux 下 Sublime Text 中文输入

首先,我参考了好几篇文章,都是蛮不错的,先列出来: sublime-text-imfix:首先推荐这个方法,最简单,但是在我的系统上有些问题.可用这个的强烈推荐用这个 完美解决 Linux 下 Sublime Text 中文输入:讲的比较明白,也可用参考. Ubuntu下Sublime Text 3解决无法输入中文的方法: 讲解的最清楚了,建议看看. 测试系统:Ubuntu 14.04 (理论上所有 Linux 发行版都通用) 输入法:Fcitx 4.2.6.1 Sublime Text 版本:

3.2.5.10 识别中文的正则表达式

3.2.5.10 识别中文的正则表达式 在我们编写程序时,经常需要判断输入的字符是否包括有中文字符,比如特定的注册帐号,一般不支持中文字符.又比如在电话输入框里输入了中文字符,这时就需要正则表达式来判断是否合法了. 例子: import re print('[u4e00-u9fa5]') m = re.findall('[\u4e00-\u9fa5]', 'abc abc 中国 456') if m: print(m) 结果输出如下: [u4e00-u9fa5] ['中', '国'] 在这里使用

解决Linux文档显示中文乱码问题以及编码转换

解决Linux文档显示中文乱码问题以及编码转换 使vi支持GBK编码 由于Windows下默认编码是GBK,而linux下的默认编码是UTF-8,所以打开会变成乱码.因此,我们只需要改变一下配置文件,使得vi支持GBK 打开~/.vimrc文件 加上 1.let &termencoding=&encoding2.set fileencodings=utf-8,gbk 然后:wq保存并退出 再次打开vi就显示正常了. 将其它的编码的文件转换成utf-8 另外,还可以将其它的编码的文件转换成u

Ubuntu下解决解压zip文件中文文件名乱码问题

在Ubuntu下解压Windows下压缩的zip文件时,会出现解压出的带中文文件名的文件名乱码,这是因为Ubuntu和Windows默认的编码不同,Ubuntu下默认的编码是UTF-8,而Windows下默认的编码是GBK.对于这个问题,主要有以下三种解决方法: 一.命令行指定解压字符集 在Ubuntu下解压来源于Windows的zip文件,中文文件名会出现乱码问题. 出现这个问题的原因是:Windows和Ubuntu使用的默认编码不相同,而且zip文件自身却不带有任何标识其编码的信息.解决方案

Ubuntu中解决解压zip文件中文乱码问题

1. 通过unzip行命令解压,指定字符集 unzip -O CP936 xxx.zip (用GBK, GB18030也可以) 有趣的是unzip的manual中并无这个选项的说明, unzip --help对这个参数有一行简单的说明. 2. 在环境变量中,指定unzip参数,总是以指定的字符集显示和解压文件 /etc/environment中加入2行 UNZIP="-O CP936" ZIPINFO="-O CP936"Ubuntu中解决解压zip文件中文乱码问题