Erlang,io_lib和unicode

mar*_*rcc 3 unicode erlang

我有点麻烦让erlang给我一个unicode字符串.

这是有效的:

io:format("~ts~n", [<<226,132,162>>]).

ok

但是我不想打印到控制台,而是将其分配给变量.所以我认为:

T = lists:flatten(io_lib:format("~ts~n", [<<226,132,162>>])).
T.
[8482,10]

如何Tio_lib示例中包含符号,以便将其写入网络流?

sar*_*old 5

不必将扁平化版本分配给变量以在网络上发送,您可以改写通过网络发送的代码以首先接受二进制文件并~ts在通过套接字发送时使用格式化的写机制吗?

这样还可以避免lists:flatten使用内置IO机制不需要的。

  • 第一件事就是知道您需要做什么。您只能在网络上发送字节,因此由编码点组成的unicode字符串之类的东西可能会大于255,而发送方则需要对其进行编码,而接收方则需要对其进行解码。UTF-8是unicode字符串最常用的编码,这就是您从io_lib调用中得到的。通过网络发送unicode字符串的一种非常合理的方法是将它们编码为UTF8。但是,请勿为此使用io_lib:format。unicode:characters_to_binary / 1是用于在utf-8编码的二进制文件中转换unicode字符串的函数 (3认同)

Ale*_*nov 5

它确实包含商标符号:正如您在此处看到的,8482是其代码.它不会在shell中打印为™,因为shell只打印字符串列表,其中包含Latin-1中的可打印字符代码.Unicode字符串[8482, 10] 也是如此(采用UTF-32编码).如果要将其转换为其他编码,请使用该unicode模块.


Sam*_*vas 5

首先要知道你需要做什么.然后,您可以以最佳方式调整代码.

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.