Вызывает символы Юникода в {html, ...} - PullRequest
2 голосов
/ 01 марта 2012

Почему {html, "доуч" ++ [1076,1086,1091,1095]} на странице yaws выдает следующую ошибку:

Yaws process died: {badarg,[{erlang,list_to_binary,
                                    [[[[208,180,208,190,209,131,209,135,1076,
                                        1086,1091,1095]],
                                        ...

"доуч" = [1076,1086,1091, 1095] -> дает точное совпадение, но как рысканья переводят 2 байта на список элементов в два раза длиннее списка с 1 байтом на элемент для «доуч», но не делают этого для [1076,1086,1091,1095].Есть ли какая-то внутренняя повторная привязка задействованных данных Unicode?

Я хочу вывести на веб-страницы списки, такие как [1076,1086,1091,1095], но они разбиты.

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Вы должны сделать следующее, чтобы заставить его работать:

{html, "доуч"++ binary_to_list(unicode:characters_to_binary([1076,1086,1091,1095]))}

Почему это не удается?

Если немного подробнее, то list_to_binary не удаетсяпотому что он пытается преобразовать каждый элемент в списке в байт, что он не может сделать, потому что каждое значение в [1076,1086,1091,1095] будет занимать больше байта.

Что происходит?

[1076,1086,1091,1095] - это чисто строковое представление в юникоде "доуч".Yaws пытается преобразовать строку (список) в двоичную строку, используя list_to_binary, и, таким образом, завершается неудачей.Поскольку каждый символ юникода может занимать более одного байта, нам нужно преобразовать его в байтовый массив.Это можно сделать с помощью:

unicode:characters_to_binary([1076,1086,1091,1095]). 
<<208,180,208,190,209,131,209,135>>

Теперь его можно безопасно конвертировать между списком и двоичными представлениями.См. Unicode для получения более подробной информации.

Вы можете преобразовать обратно в Unicode следующим образом:

unicode:characters_to_list(<<208,180,208,190,209,131,209,135>>).
[1076,1086,1091,1095]
1 голос
/ 01 марта 2012

Исходные файлы Erlang поддерживают только кодировку ISO-LATIN-1.Консоль Erlang может принимать символы Юникода, но для ввода их в файл исходного кода вам необходимо использовать следующий синтаксис:

K = "A weird K: \x{a740}".

См. http://www.erlang.org/doc/apps/stdlib/unicode_usage.html для получения дополнительной информации.

...