我正在开展一个需要国际化支持的项目.我想通过UTF支持开始,我想知道在Erlang中处理UTF的最佳做法是什么?
从我目前的研究来看,似乎有一些问题与Erlang的内置字符串处理一些用例(JSON解析是一个很好的例子).
我一直在关注Starling并最近阅读(某处),它可能会作为UTF'标准'进入标准的Erlang版本.这是真的?我应该关注其他图书馆或方法吗?
来自评论:
EEP(Erlang Enhancement Proposal)10详细信息表示Erlang中的Unicode字符
这一页:
http://erlang.org/doc/highlights.html
...列出5.7/OTP R13A版本的亮点.请注意这段话:
1.2 Unicode支持
如EEP10中所述,实现对Unicode的支持.io和io_lib模块支持从终端和文件格式化和读取unicode数据.文件可以在模式下打开,可以自动转换为不同的unicode格式.模块"unicode"包含用于外部和内部unicode格式之间转换的函数,re模块支持unicode数据.还有用于指定ISO-latin-1范围之外的字符串和字符数据的语言语法.
我不喜欢就最佳实践做出声明,但我经常发现有一个最小的,完整的例子开始概括是有帮助的.这是将erf应用到erlang应用程序并再次发送到不同的上下文之一.假设你有一个包含utf8字符的表中包含行字段的MySql数据库,这里有一种方法可以将其输出并将其作为json传输到Web浏览器:
hg clone http://bitbucket.org/justin/webmachine/ webmachine-read-only
cd webmachine-read-only
make
./scripts/new_webmachine.erl mywebdemo /tmp
svn checkout http://erlang-mysql-driver.googlecode.com/svn/trunk/ erlang-mysql-driver-read-only
cd erlang-mysql-driver-read-only/src
cp * /tmp/mywebdemo/src
svn checkout http://mochiweb.googlecode.com/svn/trunk/ mochiweb-read-only
cp mochiweb-read-only/src/mochijson2.erl /tmp/mywebdemo/src
cd /tmp/mywebdemo
Run Code Online (Sandbox Code Playgroud)
编辑src/mywebdemo_resource.erl,看起来像这样:
-module(mywebdemo_resource).
-export([init/1, to_html/2]).
-include_lib("webmachine/include/webmachine.hrl").
init([]) -> {ok, undefined}.
to_html(ReqData, State) ->
mysql:start_link(pool_id, "database.host.com", 3306, "db_user", "db_password", "db_name", fun(A, B, C, D) -> ouch end, utf8), %% add your connection string info
{data, Res} = mysql:fetch(pool_id, "select * from table where IdWhatever = 13"),
[[_, Utf8Str, _]] = mysql:get_result_rows(Res), %% pattern will need to be altered to match your table structure
{mochijson2:encode({struct, [{Utf8Str, 100}]}), ReqData, State}.
Run Code Online (Sandbox Code Playgroud)
构建所有内容并启动url调度程序:
make
./start.sh
Run Code Online (Sandbox Code Playgroud)
然后在网页中执行以下操作(或更方便的操作,如MozRepl):
var req = new XMLHttpRequest;
req.open('GET', "http://localhost:8000", false);
req.send(null);
eval("(" + req.responseText + ")");
Run Code Online (Sandbox Code Playgroud)