Erlang, io_lib и Unicode - PullRequest
       15

Erlang, io_lib и Unicode

2 голосов
/ 24 декабря 2011

У меня небольшие проблемы с получением Эрланга, чтобы дать мне строку Unicode.

Вот что работает:

io:format("~ts~n", [<<226,132,162>>]).<br> ™<br> ok

Но вместо печати на консоль я хочу назначить ее переменной. Вот я и подумал:

T = lists:flatten(io_lib:format("~ts~n", [<<226,132,162>>])).<br> T.<br> [8482,10]

Как я могу получить T в примере io_lib, содержащий символ , чтобы я мог записать его в сетевой поток?

Ответы [ 3 ]

5 голосов
/ 24 декабря 2011

Он содержит символ торговой марки: как вы можете видеть здесь , 8482 - его код.Он не печатается как ™ в оболочке, поскольку оболочка печатает в виде строк только списки, которые содержат печатный код символа в Latin-1.Таким образом, [8482, 10] является строкой Unicode (в кодировке UTF-32).Если вы хотите преобразовать его в другую кодировку, используйте модуль unicode.

5 голосов
/ 29 декабря 2011

Прежде всего, нужно знать, что вам нужно делать.Затем вы можете адаптировать свой код наилучшим способом.

Erlang представляет строки Unicode в виде списков кодовых точек.Кодовые точки Unicode являются целыми числами, а не байтами.Snce вы можете отправлять только байты по сети, такие вещи, как строки Unicode, должны быть закодированы в последовательности байтов отправляющей стороной и декодированы принимающей стороной.UTF-8 является наиболее часто используемой кодировкой для строк Unicode, и это то, чем является ваш двоичный файл, кодировкой UTF-8 строки Unicode, состоящей из кодовой точки 8482.

Что вы получаете из вызова io_lib:formatявляется строковым представлением erlang этой кодовой точки плюс символ новой строки.

Очень разумный способ отправки строк Unicode по сети - это их кодирование в UTF-8.Не используйте для этого io_lib:format.unicode:characters_to_binary/1 - это функция, предназначенная для преобразования строк Unicode в двоичные файлы в кодировке UTF-8.

На принимающей стороне (и, возможно, даже лучше во всем приложении) вам придется решить, как вы будете обрабатывать строкилибо в закодированных двоичных файлах (или списках), либо в простых списках Unicode.Но по сети единственный выбор - использовать двоичные файлы (или iolists, которые, возможно, имеют глубокие списки байтов), и я уверен, что наиболее разумной кодировкой для вашего приложения будет UTF-8.

4 голосов
/ 24 декабря 2011

Вместо того, чтобы назначать плоскую версию переменной для отправки по сети, вы можете вместо этого переписать свой код, который отправляет по сети, чтобы в первую очередь принять двоичный файл и использовать механизм форматированной записи ~ts при отправке через розетку?

Это также позволит вам избежать lists:flatten, который не нужен для встроенных механизмов ввода-вывода.

...