解决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").ok16> 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 ->Errorend.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的代码。参考:

版权声明:本文为博主原创文章,未经博主允许不得转载。

有我们特有的记忆,亲情之忆友谊之花爱情之树以及遗憾之泪!

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

相关文章:

你感兴趣的文章:

标签云: