Erlang, как печатать строки Unicode? - PullRequest
1 голос
/ 29 апреля 2011

Я использую формат io: для записи сообщений на диск.Каждое сообщение выглядит как [{field1, Content1}, {field2, Content2}, ...].

Когда я использую формат io: («~ p», [Msg]) для его печати, файлбудет выглядеть как [{field1, << 123,456,789, ... >>}, ...].

Но я хочу напечатать строки Юникода в их первоначальном виде, а не как целочисленные массивы.Что мне делать?

Ответы [ 2 ]

8 голосов
/ 30 апреля 2011

butter71 правильно, что вы не сможете просто распечатать термин и интерпретировать двоичные файлы как Unicode. Сначала вам нужно изолировать двоичные файлы. При печати двоичных файлов вам также необходимо использовать 't', что позволит вам печатать символы вне диапазона latin1. Смотри: http://www.erlang.org/doc/man/io_lib.html#format-2

Вот пример распечатки чего-то похожего на вас. Я использую Unicode: characters_to_binary, чтобы преобразовать то, что я ввел в UTF8. Простое выполнение << "¿, ©, ō" >> вызовет исключение.

Msg = [{field1, unicode:characters_to_binary("¿,©,ō")}, {field2, ...}, ...]
[{field1, Field1}|_] = Msg.
io:format("~ts~n", [Field1]).
¿,©,ō
ok
io:format("~s~n", [Field1]). 
¿,©,Å
ok

Как вы можете видеть, пример без 't' производит искаженный текст.

Если вы собираетесь попробовать пройтись по структуре, чтобы преобразовать ее в строку и распечатать, посмотрите на iolists.

0 голосов
/ 29 апреля 2011

Возможно, вам удастся просто использовать «~ s» вместо «~ p».

Также проверьте модуль юникода для выполнения преобразований - http://erldocs.com/R14B/stdlib/unicode.html

edit: iпрочитайте ваш вопрос еще раз и поймите, что вы хотите напечатать всю структуру.вам, вероятно, придется сначала разбить его на части, я не думаю, что ~ p сделает то, что вы хотите.

...