yaws символы юникода в {html,}

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

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

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

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


person Yola    schedule 01.03.2012    source источник


Ответы (2)


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

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

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

person Kevin Albrecht    schedule 01.03.2012

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

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

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

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

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

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

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

Теперь это можно безопасно конвертировать между списками и двоичными представлениями. Подробнее см. unicode.

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

unicode:characters_to_list(<<208,180,208,190,209,131,209,135>>).
[1076,1086,1091,1095]
person mbsheikh    schedule 02.03.2012