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. Tempter of the Bone——DFS(王道)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  2. LVS负载均衡之NAT模式部署

    1.LVS的NAT模式介绍 参考自官网:http://www.linuxvirtualserver.org/zh/lvs3.html 由于IPv4中IP地址空间的日益紧张和安全方面的原因,很多网络使用 ...

  3. webmagic 下载页面

    下面是webmagic官方的默认实现HttpClientDownloader中的下载方法. @Override public Page download(Request request, Task t ...

  4. Android——DEBUG 堆栈

    当android系统执行出现死机等致命错误的时候.通常会有堆栈的DEBUG信息打印,一般直接看根本看不出问题是出在哪里!记录下我android4.2 的DEBUG 堆栈log的方法. 撰写不易,转载请 ...

  5. 在 Word 中的受支持的区域设置标识符的列表

    这篇文章包含当前可用的区域设置 ID (LCID) 语言代码的列表.   概要 这篇文章包含当前可用的区域设置 ID (LCID) 语言代码的列表. 区域设置 ID (LCID): 由 Microso ...

  6. 微信团队分享:iOS版微信的高性能通用key-value组件技术实践

    本文来自微信开发团队guoling的技术分享. 1.前言 本文要分享的是iOS版微信内部正在推广和使用的一个高性能通用key-value 组件的技术实践过程,该组件在微信内部被命名为MMKV(以下简称 ...

  7. django迁移model到别的app中

    举例: 移动 users.AccessKey 到 authentication.AccessKey中 1. 移动models到新的app中 $ mv users/models/access_key.p ...

  8. Linux启动U盘制作

    Linux目前最好的u盘启动工具之一,下面介绍它的用法,首先下载Linux live OK了,一步一步跟我步骤走! 启动时,选择需要用的U盘 步骤二,就选择安装源即可(一般为ISO文件) 最后进行步骤 ...

  9. Android - 错误:Unable to instantiate application

    错误:Unable to instantiate application 本文地址: http://blog.csdn.net/caroline_wendy 错误:java.lang.RuntimeE ...

  10. 【Python3 爬虫】04_urllib.request.urlretrieve

    urllib模块提供的urlretrieve()函数,urlretrieve()方法直接将远程的数据下载到本地 urllib语法 参数url:传入的网址,网址必须得是个字符串 参数filename:指 ...