我有点麻烦让erlang给我一个unicode字符串.
这是有效的:
io:format("~ts~n", [<<226,132,162>>]).
™
ok
但是我不想打印到控制台,而是将其分配给变量.所以我认为:
T = lists:flatten(io_lib:format("~ts~n", [<<226,132,162>>])).
T.
[8482,10]
如何T在io_lib示例中包含™符号,以便将其写入网络流?
不必将扁平化版本分配给变量以在网络上发送,您可以改写通过网络发送的代码以首先接受二进制文件并~ts在通过套接字发送时使用格式化的写机制吗?
这样还可以避免lists:flatten使用内置IO机制不需要的。
首先要知道你需要做什么.然后,您可以以最佳方式调整代码.
Erlang将unicode字符串表示为代码点列表.Unicode代码点是整数,而不是字节.因此,你只能通过网络发送字节,像unicode字符串这样的东西需要由发送方在字节序列中编码,并由接收方解码.UTF-8是unicode字符串最常用的编码,这就是你的二进制文件,即由代码点8482组成的unicode字符串的UTF-8编码.
你从io_lib:format调用中获得的是该代码点的erlang字符串表示加上新的行字符.
通过网络发送unicode字符串的一种非常合理的方法是将它们编码为UTF-8.但是,请不要使用io_lib:format它.unicode:characters_to_binary/1是用于转换UTF-8编码二进制文件中的unicode字符串的函数.
在接收方(在整个应用程序中可能更好),您将必须决定如何处理字符串,无论是在编码的二进制文件(或列表)中还是在简单的unicode列表中.但通过网络唯一的选择是使用二进制文件(或可能是深度字节列表的iolists),我敢打赌,对你的应用程序最合理的编码将是UTF-8.
| 归档时间: |
|
| 查看次数: |
1877 次 |
| 最近记录: |