最近想用Erlang新版本R14B下的wxErlang做点事情,却又遭遇Unicode困扰。没想到,很快就彻底弄清了问题的原因,找到了解决之道。
Erlang能够处理Unicode,是从版本R13A开始的。不过,经过中间7、8个版本,直到目前的R14B03,Erlang只能在werl.exe开启的shell中,把UTF-8多字节编码,解析成双字节构成的单一Unicode字符。而至少在R13A和R13B中,由erlc.exe编译非ASCII字符时,生成的UTF-8存在很大问题,甚至让人怀疑是假的。
发现这个问题,是对R13B测试的结果。据此,我写了《Erlang 中文简体字 GB2312 转 Unicode 的办法》。这两天,又发现了更为确凿的证据。
打开R13B的wxErlang例程sudoku_gui.erl,把函数create_window() 的第一行
Frame = wxFrame:new(wx:null(), -1, "Sudoku", []),
替换成以下内容:
Bin2 = unicode:characters_to_binary("中文窗口", utf8),
L2 = unicode:characters_to_list(Bin2),
gb2u:start(),
U = gb2u:get_unicode(L2,[]),
Frame = wxFrame:new(wx:null(), -1, U, []),
这里的L2本应是UTF-8,实际上却是GB2312。模块gb2u.erl,正是根据GB2312检索对应Unicode的。
Erlang能够处理Unicode,是从版本R13A开始的。不过,经过中间7、8个版本,直到目前的R14B03,Erlang只能在werl.exe开启的shell中,把UTF-8多字节编码,解析成双字节构成的单一Unicode字符。而至少在R13A和R13B中,由erlc.exe编译非ASCII字符时,生成的UTF-8存在很大问题,甚至让人怀疑是假的。
发现这个问题,是对R13B测试的结果。据此,我写了《Erlang 中文简体字 GB2312 转 Unicode 的办法》。这两天,又发现了更为确凿的证据。
打开R13B的wxErlang例程sudoku_gui.erl,把函数create_window() 的第一行
Frame = wxFrame:new(wx:null(), -1, "Sudoku", []),
替换成以下内容:
Bin2 = unicode:characters_to_binary("中文窗口", utf8),
L2 = unicode:characters_to_list(Bin2),
gb2u:start(),
U = gb2u:get_unicode(L2,[]),
Frame = wxFrame:new(wx:null(), -1, U, []),
这里的L2本应是UTF-8,实际上却是GB2312。模块gb2u.erl,正是根据GB2312检索对应Unicode的。