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

这个问题非常easy重现:新建一个文件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 ->
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

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

  1. jmeter中接口测试出现乱码或不识别中文解决办法

    在查看结果是中出现乱码时:jmeter的bin目录下的jmeter.properties下最下面添加sampleresult.default.encoding=UTF-8后重新打开工具就好了 在接口的 ...

  2. Tesseract-OCR4.0识别中文与训练字库实例

    关于中文的识别,效果比较好而且开源的应该就是Tesseract-OCR了,所以自己亲身试用一下,分享到博客让有同样兴趣的人少走弯路. 文中所用到的身份证图片资源是百度找的,如有侵权可联系我删除. 一. ...

  3. 自学Python1.5-Centos内python2识别中文

    自学Python之路 自学Python1.5-Centos内python2识别中文 方法一,python推荐使用utf-8编码方案 经验一:在开头声明: # -*- coding: utf-8 -*- ...

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

    首先,我参考了好几篇文章,都是蛮不错的,先列出来: sublime-text-imfix:首先推荐这个方法,最简单,但是在我的系统上有些问题.可用这个的强烈推荐用这个 完美解决 Linux 下 Sub ...

  5. Tesseract-OCR识别中文与训练字库实例

    关于中文的识别,效果比较好而且开源的应该就是Tesseract-OCR了,所以自己亲身试用一下,分享到博客让有同样兴趣的人少走弯路. 文中所用到的身份证图片资源是百度找的,如有侵权可联系我删除. 一. ...

  6. Myeclipse解决dubbo标签不识别问题

    Myeclipse解决dubbo标签不识别问题,引入dubbo.xsd文件,即可:              

  7. android窗口泄漏,isInEditMode解决可视化编辑器无法识别自定义控件的问题

    android窗口泄漏 在做项目是遇到这个错误:google:WindowManager: Activity has leaked window. 产 生原因:我们知道Android的每一个Activ ...

  8. java整理软件--- Java OCR 图像智能字符识别技术,可识别中文,但是验证码不可以识别...已测识别中文效果很好

    国内最专业的OCR软件只有2家,清华TH-OCR和汉王OCR,看了很多的OCR技术 发现好多对英文与数字的支持都很好,可惜很多都不支持中文字符.Asprise-OCR,Tesseract 3.0以前的 ...

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

    解决Linux文档显示中文乱码问题以及编码转换 解决Linux文档显示中文乱码问题以及编码转换 使vi支持GBK编码 由于Windows下默认编码是GBK,而linux下的默认编码是UTF-8,所以打 ...

随机推荐

  1. elasticsearch term 查询之一

    1.前言 term级别查询将按照存储在倒排索引中的确切字词进行操作,这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段. 或者,它们允许您制作低级查询,并在分析过程之前进行. term级别 ...

  2. volatile型变量自增操作的隐患

      用FindBugs跑自己的项目,报出两处An increment to a volatile field isn't atomic.对应报错的代码例如以下: volatile int num = ...

  3. Druid对比Cassandra

    不是Cassandra专家, 如果描绘有错误, 请通过邮件列表或者其他方式告知, 我们会修正. Druid对扫描和聚合做了很大程度的优化, 不用提前计算就支持任意的向下钻取, 还可以实时摄入流式数据并 ...

  4. 【重点突破】—— Vue2.0 transition 动画Demo实践填坑

    前言:vue1.0版本和2.0版本的过渡系统改变是很大的,具体请详看文档介绍.本文转载自郭锦荣的博客,一共列举了四种transition的使用实践,分别是css过渡.css动画.javascript钩 ...

  5. 大话项目管理工具之Jira篇

    前言 上一篇文章谈的是知识管理工具 -- Confluence,它来自澳大利亚 Atlassian 公司. 非常凑巧的是,今天要介绍的 JIRA 也是来自 Atlassian 公司的.但他不再是知识管 ...

  6. Python Socket API 笔记

    将上节中的C#该成Python版的容易程度大大超出了我的意料之外.从来没有发现,仅仅用灰尘简单的几句话就实现了该程序的主要功能,可见python的简易和强大之处.这里先对SocketAPI 做一下总结 ...

  7. 绘制 SVG

    工具网址:http://svg123.com/ 画布 点击画布,在页面的右侧我们可以调整画布属性 点击属性,滚动滑轮可以微调 或者直接双击修改属性值 工具栏 左侧工具栏 就像画图的工具栏一样 形状库 ...

  8. 【 D3.js 入门系列 --- 5 】 怎样加入坐标轴

    本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处.谢谢.      第3节中做了一个图标.但没有为它加入一个对应的坐标轴. ...

  9. [WebView学习之三]:使用WebView来创建Apps

    上一篇我们学习了([WebView学习之二]:使用Web Apps 支持不同分辨率屏),今天我们来继续学习. (博客地址:http://blog.csdn.net/developer_jiangqq) ...

  10. android:id="@android:id/tabhost" 、android:id="@+id/llRoot" 、android:id="@id/llRoot" 之间的区别

    由于快要放暑假了,所以最近这俩周把Android方面的知识复习一下,准备找个实习工作. 顺便把自己的总结更大家分享一下,共同进步,谢谢.... 一. android:id="@android ...