[Erlang]解决R17中文编码的问题

news/2023/12/9 16:54:20

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

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

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. -module(t).  
  2. -export([test/0]).  
  3. test() ->  
  4.     ["我", <<"我">>].  
在旧版的erlang中,下面的代码能正常工作,结果就是:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Eshell V5.9.1 (abort with ^G)  
  2. 1> c(t).  
  3. {ok,t}  
  4. 2> t:test().  
  5. [[230,136,145],<<230,136,145>>]  
R17编译后的运行结果为:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Eshell V6.0 (abort with ^G)  
  2. 1> c(t).  
  3. {ok,t}   
  4. 2> t:test().   
  5. [[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”,代码就变成这样:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. %% coding: latin-1  
  2. -module(t).  
  3. -export([test/0]).  
  4. test() ->  
  5.       ["我", <<"我">>].  
问题是,写个脚本对旧的代码文件做修改虽然不麻烦,但新加进来的文件还要加上这个头部申明,确定有点坑爹。而且受影响的还有 file:consult/1 ,也是要加上头部申明

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

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

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. -module(test).  
  2. -compile(export_all).  
  3.   
  4. compile(FileName) ->  
  5.     compile(FileName, [verbose,report_errors,report_warnings]).  
  6.   
  7. compile(FileName, Options) ->  
  8.     Module = filename:basename(FileName),  
  9.     {ok, Forms } = epp:parse_file(FileName, [{default_encoding, latin1}]) ,  
  10.     {ok, Mod, Code} = compile:forms(Forms, Options),  
  11.     {ok, Cwd} = file:get_cwd(),  
  12.     code:load_binary(Mod, FileName, Code),  
  13.     file:write_file(lists:concat([Cwd, Module, ".beam"]), Code, [write, binary]).  
注意了,以上代码不要在R17之前erlang使用,某些接口erlang还没提供支持。运行结果如下:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 14> c(test).  
  2. {ok,test}  
  3. 15> test:compile("t.erl").  
  4. ok  
  5. 16> t:test().  
  6. [[230,136,145],<<230,136,145>>]  
另外,也重新实现了file:consult/1,如下:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. consult(File) ->  
  2.     case file:open(File, [read]) of  
  3.     {ok, Fd} ->  
  4.         R = consult_stream(Fd),  
  5.         _ = file:close(Fd),  
  6.         R;  
  7.     Error ->  
  8.         Error  
  9.     end.  
  10.   
  11. consult_stream(Fd) ->  
  12.     _ = epp:set_encoding(Fd, latin1),  
  13.     consult_stream(Fd, 1, []).  
  14.   
  15. consult_stream(Fd, Line, Acc) ->  
  16.     case io:read(Fd, '', Line) of  
  17.     {ok,Term,EndLine} ->  
  18.         consult_stream(Fd, EndLine, [Term|Acc]);  
  19.     {error,Error,_Line} ->  
  20.         {error,Error};  
  21.     {eof,_Line} ->  
  22.         {ok,lists:reverse(Acc)}  
  23.     end.  
虽然这里能解决erlang R17无法识别中文问题, 但还是希望erlang在以后的版本能提供一个参数用以兼容latin的代码。

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

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

相关文章

iperf3怎么看结果_iperf 和 iperf3 命令以及参数详解

一、iperf 和 iperf3 介绍 perf是一个网络性能测试工具。 可以测试TCP和UDP带宽质量, -可以测量最大TCP带宽, 具有多种参数和UDP特性, 可以报告带宽, 延迟抖动 数据包丢失。 Iperf在linux和windows平台均有二进制版本供自由使用。 iperf3是用来测量一个网络最大带宽的工具。…

软与硬的碰撞,打造出OPPO R17 Pro的强悍夜拍体验

作为准旗舰定位的时尚手机&#xff0c;OPPO R17 Pro上市后通过出色的能效表现与优秀的拍照体验&#xff0c;获得了极高的市场评价。 对目前的手机市场而言&#xff0c;消费者们从追求功能的丰富性转而开始追求极致体验&#xff0c;手机的拍照表现也不例外。而OPPO R17 Pro在拍照…

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

erlang更新到R17已有一段时间了&#xff0c;公司项目打算从旧版的erlang迁移到R17&#xff0c;却不料有不少的困扰&#xff0c;其中一个问题是中文问题。 这个问题很容易重现&#xff1a;新建一个文件t.erl&#xff0c;保存为utf-8无bom格式 -module(t). -export([test/0]). t…

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…

5G NR Positioning enhancement (R17)

一 Review 从标题大家可以看到&#xff0c;本篇文章是在介绍5G R17 NR positioning enhancement。先说背景&#xff0c;随着Rel 17的冻结&#xff0c;我们可以这样理解5G三个版本的迭代&#xff0c;如果Rel 15版本是5G的“毛坯”&#xff0c;则Rel 16可以理解为“精装”&#…

3GPP R17研究项目

3GPP Release17从2019年底开始到2022年6月冻结&#xff0c;历时两年多&#xff0c;从3GPP官网可以看到如下关于R17版本时间和主要研究项目。 图片来源于3GPP官网 图片来源与3GPP官网​​​​​​ TS 21.917总结了R17的研究项目&#xff0c;下表列出了部分项目的简要介绍。 研究…

3GPP R17覆盖增强

R17覆盖增强包含五个方面&#xff0c;(1) Enhancements on PUSCH repetition Type A&#xff1a;最大重复次数增加到32&#xff1b;(2) TB processing over multiple slots PUSCH (TBoMS)&#xff1a;一个TB在多个时隙发送&#xff1b;(3) DMRS bundling for PUSCH/PUCCH&#…

MIT 6.824 lab distributed system 分布式系统

https://youtu.be/cQP8WApzIQQ 概念 为什么需要分布式系统&#xff1f; high performanceparallelism&#xff1a;分布式系统可以实现CPU、内存、硬盘的并行运行fault tolerancephysical&#xff1a;security / isolated 分布式系统的困难 concurrency&#xff1a;各个并行的…

联想小新锐7000拆机+安装内存条图解(转载)

转载博客地址&#xff1a; https://blog.csdn.net/qq_32231883/article/details/89891506 ps:收藏以备用

联想小新锐7000重装避坑教程

忘了好久没更的联想小新锐重装避坑教程 大概流程和其他品牌电脑一样&#xff0c;这里提示几个坑。 1.进bios的按键是FnF2 2.设置启动顺序时的按键是FnF5(↓)、FnF6(↑) 3.C盘为固态硬盘&#xff0c;但只有60G&#xff0c;重装前如果对系统盘空间有要求&#xff0c;可考虑安装到…

联想笔记本小新pro16酷睿版评测

联想笔记本小新pro16酷睿版的屏幕素质很高&#xff0c;其尺寸大小是16英寸&#xff0c;采用了2.5k的高分辨率&#xff0c;100%sRGB的高色域&#xff0c;300nits亮度&#xff0c;16:10的屏幕比例&#xff0c;对于日常使用来说&#xff0c;画质体验好&#xff0c;文字显示细腻。联…

联想小新pro16和联想小新pro14 2022款哪个好

1、屏幕区别&#xff1a;小新Pro14是14英寸&#xff0c;2.8k分辨率&#xff0c;小新Pro16是16英寸&#xff0c;2.5k分辨率&#xff1b; 2、处理器区别&#xff1a;小新Pro14搭载了i5 12500h处理器&#xff0c;小新Pro16有i5 12500h、i7 12700h&#xff0c;r7 6800h&#xff1b;…

联想小新 Pad Plus 2023 款评测

联想小新 Pad Plus 2023 款拥有“暗夜绿”和“深空灰”两款配色&#xff0c;重量 520g&#xff0c;厚度为 7.4mm。 联想小新 Pad Plus 2023 款搭载联发科 Helio G99 处理器&#xff0c;配备 6GB 128GB 存储&#xff0c;拥有 7700mAh 电池&#xff0c;支持 USB-C 接口 20W 充电…
最新文章