在{html,...}中偏航unicode符号

时间:2012-03-01 09:27:54

标签: unicode erlang yaws

为什么{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如何将每个elem列表中的2个字节转换为两倍长的列表,每个elem 1个字节用于“доуч”,但不适用于[1076,1086,1091,1095]。是否有一些内部重新编写的unicode数据?

我想输出像[1076,1086,1091,1095]这样的网页列表,但它已经粉碎了。

2 个答案:

答案 0 :(得分:1)

Erlang源文件仅支持ISO-LATIN-1字符集。 Erlang控制台可以接受Unicode字符,但要在源代码文件中输入它们,您需要使用以下语法:

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

有关详细信息,请参阅http://www.erlang.org/doc/apps/stdlib/unicode_usage.html

答案 1 :(得分:1)

您必须执行以下操作才能使其正常工作:

{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字符可能需要多个字节,因此我们需要将其转换为字节数组。这可以使用:

完成
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]