Erlang 中文简体字 GB2312 转 unicode 的办法(1)

这些天,一直在琢磨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 = get({A,B}),

   get_unicode(Z,[H|U]).

这个函数可以处理中西文混合的字符串,如: 

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]

下面的问题,是要把GB2312全部汉字及其相应的unicode,逐一put到Erlang进程中。

这个问题,也就是建立在Erlang中使用的编码转换表。它无法在Erlang中编程解决,因为,Erlang的编译器erlc不支持unicode。

具体解决办法,以后接着说。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值