2012-03-01 3 views
3

Почему {HTML, "доуче" ++ [1076,1086,1091,1095]} фрамбезии-страница дает мне следующую ошибку:символы Юникода борьбы против фрамбезии в {HTML, ...}

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], но он раздавлен.

ответ

1

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

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

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

2

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

{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:characters_to_list(<<208,180,208,190,209,131,209,135>>). 
[1076,1086,1091,1095]