Строки в Erlang - какие библиотеки и методы мне следует изучить? - PullRequest
2 голосов
/ 31 августа 2009

Я работаю над проектом, который потребует поддержки интернационализации в будущем. Я хочу начать работать с поддержкой UTF, и мне было интересно, как лучше всего работать с UTF в Erlang?

Из моего текущего исследования кажется, что есть пара проблем со встроенной обработкой строк в Erlang для некоторых случаев использования (хороший пример - разбор JSON).

Я смотрел на Старлинг и недавно прочитал (где-то), что он, возможно, будет включен в стандартную версию Erlang в качестве UTF-стандарта Это правда? Есть ли другие библиотеки или подходы, на которые я должен смотреть?

Из комментариев:

EEP (Предложение по расширению Erlang) 10 деталей Представление символов Юникода в Erlang

Ответы [ 2 ]

5 голосов
/ 02 сентября 2009

Эта страница:

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

... перечисляет основные моменты выпуска 5.7 / OTP R13A. Обратите внимание на этот отрывок:

1.2 Поддержка Unicode

Поддержка Unicode реализована как описано в EEP10. Форматирование и чтение данных Unicode как из Терминалы и файлы поддерживаются модули io и io_lib. Файлы могут открываться в режимах с автоматическим перевод в и из разных форматы Юникода. Модуль «Юникод» содержит функции для конвертации между внешним и внутренним юникодом форматы и повторный модуль имеет поддержку для данных Unicode. Существует также синтаксис языка для указания строки и данные персонажа за пределами ISO-latin-1 диапазон.

Я не люблю высказывать свое мнение о том, какими будут лучшие практики, но я часто нахожу полезным иметь минимальный, полный пример, с которого можно начать обобщать. Вот один из способов получить utf в приложение erlang и отправить его снова в другой контекст. Предполагая, что у вас есть база данных MySql с полем строки в таблице, содержащей символы utf8, вот один из способов получить ее и передать в веб-браузер как json:

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 + ")");
0 голосов
/ 06 сентября 2009

Как упоминалось в предыдущем постере, последняя версия erlang изначально поддерживает utf. Если вы не можете использовать последнюю версию, тогда я обычно делаю двоичные файлы для строковых данных. Это удерживает Эрланга от искажения байтов в списке. У него также есть побочный эффект, облегчающий обработку списков строк.

...