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

news/2024/11/25 22:32:13/

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模式。

所以,这里在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 ->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的代码。

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


http://www.ppmy.cn/news/196296.html

相关文章

c语言brr17,奇幻新年大秀上的“主角”,OPPO R17丨R17 Pro新年版C位出道

原标题&#xff1a;奇幻新年大秀上的“主角”&#xff0c;OPPO R17丨R17 Pro新年版C位出道 如何过一个既传统又新鲜的新年呢&#xff1f;相信每个人给出的答案都不太一样&#xff0c;但在OPPO看来&#xff0c;包含了独特的习俗&#xff0c;张扬的视觉和强大的精神寄托才是一个完…

光耦的参数的理解

槽型光耦也被工程技术人员称作槽型光电开关或者对射式光电开关,也是以光为媒体,由发光体与受光体间的光路遮挡或由反射光的光亮变化为信号,检测物体的位置、有无等的装置。槽型光耦也是由一个红外线发射管与一个红外线接收管组合而成。它与接近开关同样是无接触式的,受检测…

NR5G R17 Cell selection and reselectio——小区选择和重选

一 Introduction 为了Cell selection和reselection&#xff0c;UE首先会进行测量。测量的具体过程这里不详细描述&#xff0c;感兴趣的可以参考38133。 NAS层控制cell selection的RAT&#xff0c;也就是说是在LTE上进行cell selection&#xff0c;还是在NR上进行cell selecti…

oppo r17听筒测试软件,【OPPOR17评测】ColorOS变智能 OPPO R17堪称生活小秘书(全文)_OPPO R17(6GB RAM/全网通)_手机评测-中关村在线...

近两年来&#xff0c;手机的全面屏设计不是美人尖就是刘海屏&#xff0c;这两种设计虽然可以扩大屏占比&#xff0c;但是缺少设计的美感。 这时候&#xff0c;OPPO R17终于为我们带来了即有较高的屏占比又优雅的全面屏设计——水滴屏&#xff0c;让摄像头向水滴一样“垂涎欲滴”…

R17低配高价进一步凸显,OPPO前行不易

OPPO今年作出了许多改变&#xff0c;不过从近日发布的R17来看其饱受诟病的低配高价依然未改&#xff0c;甚至进一步强化&#xff0c;如此做法可能不利于它提升销量&#xff0c;从二季度的数据来看其增速下滑又面临着vivo的追逼&#xff0c;如此下去恐怕将跌出全球前五。 R17低配…

R17 TRS resources for idle/inactive UEs

欢迎关注同名微信公众号“modem协议笔记”。 Idle/Inactive状态的UE在DRX周期结束时要醒来进行SSB同步&#xff0c;在SSB multi beam的情况下&#xff0c;UE的唤醒时间会比较长&#xff0c;不利于省电&#xff0c;因而R17支持给idle/inactive状态的UE配置TRS&#xff0c;UE在接…

R17 paging early indication(PEI)

欢迎关注同名微信公众号“modem协议笔记”。 引入PEI机制的动机就是让UE可以在idle或者inactive state尽可能的省电&#xff0c;按照38.304 DRX的规定UE会醒来在自己的PO上监听P-RNTI加扰的DCI&#xff0c;deocde paging&#xff0c;这就会导致有时候即使没有paging下发,UE也要…

3GPP R17连接态省电特性

Enhanced SSSG Switching SSSG(Search space set group)&#xff0c;搜索空间集合组。SSSG switching就是网络通过动态切换UE的搜索空间集来达到省电的目的。 UE通过RRC配置得到SSSG switching相关的参数&#xff0c;其中&#xff0c;包括searchSpaceGroupIdList、cellGroupsF…