`
cwqcwk1
  • 浏览: 86851 次
文章分类
社区版块
存档分类
最新评论

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

所以,这里在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官方api及stdlib手册

    R17是Erlang的一个版本,它包含了对先前版本的改进和新特性。本手册是Erlang R17的官方API及stdlib文档,为开发者提供了详尽的函数介绍和使用指南。 在Erlang的stdlib(标准库)中,你可以找到各种用于处理日常编程...

    erlang 中文乱码

    要解决Erlang中的中文乱码问题,你需要确保以下几个方面都正确无误: 1. **文件编码**:确认你要处理的文件是以正确的编码(如UTF-8)保存的。可以使用诸如Notepad++之类的文本编辑器检查和转换文件编码。 2. **...

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

    erlang英文手册+中文教程

    `erlanghandbook.doc` 和 `Erlang+.doc` 文件很可能是Erlang的详细参考手册和中文学习教程。手册通常包含语言的语法、标准库函数、并发编程指南等内容。中文教程则为初学者提供了易懂的学习材料,帮助理解Erlang的...

    Erlang程序设计中文版

    通过阅读《Erlang程序设计中文版》并结合提供的完整书签,学习者可以逐步构建起对Erlang语言的全面理解,从而在实际工作中有效地运用Erlang解决复杂的问题。无论你是初学者还是有经验的开发者,这本书都能为你提供...

    erlang25.0 windows版本

    3. **环境变量**:安装过程中,安装程序可能会自动添加Erlang的bin目录到系统的PATH环境变量中,确保命令行可以识别`erl`等Erlang命令。 4. **验证**:安装完成后,打开命令行窗口并输入`erl`,如果Erlang成功安装,...

    erlang程序设计中文版

    主流编程语言如C/C++等都在探索并行计算的解决方案,而Erlang从诞生之初就是为了并发而设计的,这使得它能够更好地适应计算环境变革的趋势。 此外,本书还包含了一些关于版权和知识产权保护的信息。电子书的读者...

    Erlang编程规则——中文翻译版本

    本文将对Erlang编程规则的中文翻译版本中的部分内容进行详细解析,包括Erlang术语、SW工程原则、程序、服务器和消息处理、Erlang特殊约定、常见错误以及所需文档约定等。 Erlang术语部分提到了Erlang程序的模块化...

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

    xiandiao_erlang_Erlang课后习题_

    6. **性能优化**:通过解决实际问题,学习者可以学习到如何有效地利用Erlang的特性进行性能优化,比如避免全局状态,利用并行计算等。 综上所述,"xiandiao"文件夹中的源码是学习Erlang编程和理解其并发特性的宝贵...

    高性能集群服务器Erlang解决方案

    ### 高性能集群服务器Erlang解决方案 #### Erlang简介及其特性 Erlang是一种专为构建高并发、高可用性和容错性系统而设计的编程语言与运行环境。其核心优势在于支持大规模并发处理能力,并能够实现分布式计算。...

    erlang中文基础教程

    "Erlang中文基础教程" Erlang 编程语言是一种功能强大且灵活的编程语言,它提供了一个交互式的 shell 环境,允许用户在其中编写和运行代码。 Erlang Shell 是一个命令行交互环境,类似于 UNIX 和 LINUX 系统的...

    Erlang官网下载过慢

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可...RabbitMQ作为基于Erlang的消息队列,为异步通信提供了可靠的解决方案。在面对下载问题时,可以尝试多种策略以获取Erlang安装包,从而继续你的开发工作。

    erlang22最新下载包

    对于开发者来说,了解这些更新和变化至关重要,因为它们可能影响到现有项目的行为,或者提供新的工具和技术来解决特定问题。学习和掌握Erlang22的新特性有助于提升开发效率和应用质量,特别是在构建高并发、分布式...

    erlang 中文基础教程

    ### Erlang 中文基础教程:理解Erlang Shell与模块函数 #### 1. Erlang Shell:编程者的交互式环境 Erlang Shell是Erlang编程语言提供的一种交互式编程环境,允许开发者直接在命令行中编写、执行Erlang代码并观察...

    erlang入门级练习:LeetCode OJ问题的部分erlang 源码

    我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...

    erlang_版本24.3.4.4

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、分布式和实时系统。版本24.3.4.4是Erlang的一个更新版本,包含了对先前版本的改进和修复。Erlang以其强大的错误...

Global site tag (gtag.js) - Google Analytics