String 默认情况下,Erlang二进制字符串

String 默认情况下,Erlang二进制字符串,string,binary,erlang,String,Binary,Erlang,我正在编写一个erlang模块,它必须处理一些字符串,但不太多,但是,我会执行一些tcp recv,然后对数据进行一些解析 在匹配数据和操作字符串时,我一直在使用二进制模块,比如binary:split(data,),基本上一直在使用 到目前为止,我还没有遇到困难或缺少替代方法(使用列表),除了添加之外,一切都很自然,但我想知道这种处理字符串的方法是否有我不知道的缺点 有什么提示吗?唯一需要注意的是二进制是字节片,而列表是unicode代码点的列表。换句话说,后者自然是unicode,而前者需要

我正在编写一个erlang模块,它必须处理一些字符串,但不太多,但是,我会执行一些tcp recv,然后对数据进行一些解析

在匹配数据和操作字符串时,我一直在使用二进制模块,比如
binary:split(data,)
,基本上一直在使用

到目前为止,我还没有遇到困难或缺少替代方法(使用列表),除了添加之外,一切都很自然,但我想知道这种处理字符串的方法是否有我不知道的缺点


有什么提示吗?

唯一需要注意的是二进制是字节片,而列表是unicode代码点的列表。换句话说,后者自然是unicode,而前者需要进行某种编码,通常是UTF-8


据我所知,您的方法没有缺点。

只要您和您的团队记住字符串是二进制文件而不是列表,这种方法就没有固有的问题。事实上,couchdb将这种方法视为一种优化,显然获得了不错的回报。

二进制文件是存储字符串的非常有效的结构。如果它们的长度超过64B,那么它们也存储在进程堆之外,所以它们不是GC的对象(当最后一个ref丢失时,仍然由ref计数GC)。不要忘记使用iolist连接它们,以避免在性能重要时进行复制。

您需要非常清楚字符串在二进制文件中的编码方式。当您在代码中执行此操作时,您必须知道这只是代码点列表的二进制序列化。您的Erlang编译器将代码读取为ISO-8859-1字符,因此只要您只使用拉丁-1字符并一致地执行此操作,就可以了,但这对国际化不是很友好

如今,大多数应用软件应该更喜欢unicode编码。UTF-8对于前128个码点与您的兼容,但对于第二个128个码点不兼容,因此请小心。如果在代码中使用UTF-8编码的web应用程序,您可能会惊讶于看到的内容

有一个EEP提议以的形式提供二进制支持,但我认为这还没有最终确定

另外,请注意,如果存在包含要拆分的IS0-8859-1字节的多字节字符,则binary:split/2函数可能会在UTF-8中产生意外结果

有些人认为UTF-16是一种更好的编码方式,因为如果您假设或验证不存在32位字符,则可以更高效地解析UTF-16,并且可以更容易地按索引拆分UTF-16

应该使用文本,但在使用文本时要小心