函数的签名是unicode:characters_to_list(Data, InEncoding),它期望Data 是包含以InEncoding 编码编码的字符串的二进制文件,或者可能是InEncoding 编码的深度字符列表(代码点)和二进制文件。它返回 unicode 字符列表。 erlang 中的字符是整数。
当您调用unicode:characters_to_list(<<208,144,208,145,208,146>>, utf8) 或unicode:characters_to_list([1040,1041,1042], utf8) 时,它会正确解码unicode 字符串(是的,只要Data 是整数列表,第二个就是noop)。但是当您调用unicode:characters_to_list([208,144,208,145,208,146], utf8) 时,erlang 认为您以utf8 编码传递了 6 个字符的列表,因为它已经是 unicode,所以输出将完全相同。
erlang 中没有 byte 类型,但您假设 unicode:characters_to_list/2 将接受 list of bytes 并且行为正确。
总结一下。在 erlang 中有两种常用的方式来表示字符串,它们是位串和字符列表。 unicode:characters_to_list(Data, InEncoding) 在InEncoding 编码中采用这些表示之一(或它们的组合)中的字符串Data,并将其转换为unicode代码点列表。
如果您的示例中有[208,144,208,145,208,146] 列表,您可以使用erlang:list_to_binary/1 将其转换为二进制,然后将其传递给unicode:characters_to_list/2,即
1> unicode:characters_to_list(list_to_binary([208,144,208,145,208,146]), utf8).
[1040,1041,1042]
unicode 模块仅支持 unicode 和 latin-1。因此,(因为函数需要 unicode 或 latin-1 的代码点)characters_to_list 在代码点的平面列表的情况下不需要对列表做任何事情。但是,列表可能很深 (unicode:characters_to_list([[1040],1041,<<1042/utf8>>]).)。这就是支持Data 参数的列表数据类型的原因。