这些天,一直在琢磨Erlang中文简体字转unicode的办法。想到过,用 port,C或Python外部模块;用erts,dict,array,但不仅都太烦琐,甚至没怎么看懂。
编程需要考虑的两大问题:功能与效率。
效率,不仅是程序运行效率,还有编程工作效率。
代码越简单效率越高。用简单的工具和办法,显不出学术理论水平,所以,常见玩高深的。
中文简体字转unicode,不是高深的问题,涉及的理论和多种解决方案,网上都能找到。
需要的是,从中得到启发,想出在Erlang中适用的最简单的办法。
还好,我找到了。
一、在Erlang中使用编码转换表
转码的办法有两类,一是用算法随机转换,它省空间费时间;二是查找事先建立的编码表,它省时间费空间。
从实用的要求看,第二种办法比较好。
这个码表结构应该怎样?这要看中文简体字编码和Erlang字符串的相关特点。
中文简体字编码,这里只考虑GB2312,它已能满足太多需求了。它的特点是一个字由两个非ASCII码字节表示,如“中”的编码D6D0。
Erlang的字符串就是整数列表,如“中”是[214,208],unicode是[20013]。
Erlang查询数据,有其内部特殊方法,不用数组下标之类。
根据这些特点,确定使用Erlang的内建函数 put/2, get/1,如:
put({214,208},20013) 将“中”字的unicode写入内存;
Unicode = get({214,208}) 将“中”字的unicode从内存里读出。
下面的函数get_unicode/1,得到整个字符串的unicode,如:get_unicode("中文窗口"),返回[20013,25991,31383,21475]。
get_unicode([],U) ->
lists:reverse(U);
get_unicode([A|T],U) when A <128 ->
get_unicode(T,[A|U]);
get_unicode([A,B|Z],U) ->
H &#61; get({A,B}),
get_unicode(Z,[H|U]).
这个函数可以处理中西文混合的字符串&#xff0c;如&#xff1a;
get_unicode2("asd中fg34文55窗66口tt4",[])
结果是 [97,115,100,20013,102,103,51,52,25991,53,53,31383,54,54,21475,116,116,52]
下面的问题&#xff0c;是要把GB2312全部汉字及其相应的unicode&#xff0c;逐一put到Erlang进程中。
这个问题&#xff0c;也就是建立在Erlang中使用的编码转换表。它无法在Erlang中编程解决&#xff0c;因为&#xff0c;Erlang的编译器erlc不支持unicode。
具体解决办法&#xff0c;以后接着说。
http://blog.csdn.net/lawme/archive/2009/05/01/4141289.aspx