【问题标题】:Strings in Erlang - what libraries and techniques should I be examining?Erlang 中的字符串 - 我应该检查哪些库和技术?
【发布时间】:2010-11-24 08:13:18
【问题描述】:

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

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

我一直在查看Starling 并最近(在某处)读到它可能会作为 UTF“标准”被纳入标准 Erlang 版本。这是真的?还有其他我应该研究的库或方法吗?

来自cmets:

EEP(Erlang Enhancement Proposal) 10个细节Representing Unicode characters in Erlang

【问题讨论】:

  • Mochijson2 对 utf8 中的 json 进行编码和解码...
  • 另外,你知道标准库中的 unicode 模块吗?
  • EEP 10 似乎被标记为已接受。不确定它是否与 Starling 有任何关系...
  • 我没有逐字阅读整个 eep,但建议的 api 似乎是在当前 erlang 版本的 unicode 模块中实现的。

标签: string erlang utf


【解决方案1】:

本页:

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 范围。

我不喜欢就什么是最佳实践发表声明,但我经常发现有一个最小的、完整的例子来开始概括是有帮助的。这是将 utf 放入 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 + ")");

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多