Erlang中的字符串 - 我应该检查哪些库和技术?

时间:2009-08-31 12:35:26

标签: string erlang utf

我正在开展一个需要国际化支持的项目。我想通过UTF支持开始,我想知道在Erlang中处理UTF的最佳做法是什么?

从我目前的研究来看,似乎有一些问题与Erlang的内置字符串处理一些用例(JSON解析是一个很好的例子)。

我最近一直在关注Starling并阅读(某处)它可能会作为UTF'标准'进入标准的Erlang版本。这是真的?我应该看看其他图书馆或方法吗?

来自评论:

EEP(Erlang Enhancement Proposal)10详细信息Representing Unicode characters in Erlang

2 个答案:

答案 0 :(得分:5)

此页:

http://erlang.org/doc/highlights.html

...列出5.7 / OTP R13A版本的亮点。请注意这段话:

  

1.2 Unicode支持

     

支持Unicode实现为   在EEP10中描述。格式化和   从中读取unicode数据   支持终端和文件   io和io_lib模块。文件可以   以自动模式打开   来自不同的翻译   unicode格式。模块'unicode'   包含转换功能   外部和内部unicode之间   格式和re模块有支持   用于unicode数据。还有   用于指定字符串的语言语法   和超出的人物数据   ISO-latin-1系列。

我不喜欢就最佳实践做出声明,但我经常发现有一个最小的,完整的例子可以开始概括。这是将erf应用到erlang应用程序并再次发送到不同的上下文之一。假设你有一个MySql数据库,在包含utf8字符的表中有一个行字段,这里有一种方法可以将它输出并以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

编辑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}.

构建所有内容并启动url调度程序:

make
./start.sh

然后在网页中执行以下操作(或更方便的操作,如MozRepl):

var req = new XMLHttpRequest;
req.open('GET', "http://localhost:8000", false);
req.send(null);
eval("(" + req.responseText + ")");

答案 1 :(得分:0)

正如之前的海报所提到的,erlang的最新版本支持utf本地。如果你不能使用最新的,那么我通常做的一件事就是使用二进制文件来表示字符串数据。它使erlang不会破坏列表中的字节。它具有使字符串列表更易于处理的副作用。