Erlang - 如何将 \u0000 字符转换为二进制?

Posted

技术标签:

【中文标题】Erlang - 如何将 \\u0000 字符转换为二进制?【英文标题】:Erlang - how to convert \u0000 character to binary?Erlang - 如何将 \u0000 字符转换为二进制? 【发布时间】:2022-01-03 15:00:47 【问题描述】:

我在将 unicode 字符转换为二进制时遇到问题。

代码:

Text = "\u0000partner\u0000"
Bin = term_to_binary(Text, [compressed, minor_version,1]),

结果:

<<131,107,0,17,117,48,48,48,48,112,97,114,116,110,101,114,117,48,48,48,48>>

但是当我从外部服务接收数据时,我看到负载有:

<<0,112,97,114,116,110,101,114,0>>

表示一次将\u0000转换为<<0>>一次转换为<<131,107,0,17,117,48,48,48,48>>作为句子的第一个字符,117,48,48,48,48和句子的结尾。

问题是:如何将<<0,112,97,114,116,110,101,114,0>> 转换为“\u0000partner\u0000”或将此字符串转换为<<0,112,97,114,116,110,101,114,0>>

【问题讨论】:

我对你的问题感到困惑。标题和最后几段有很大不同的问句(而且第一个和最后一个字符串完全一样) 【参考方案1】:

Erlang 不支持 \u 转义。请改用\x00

Text = "\x00partner\x00".
[0,112,97,114,116,110,101,114,0]
Bin = term_to_binary(Text, [compressed, minor_version,1]).
<<131,107,0,9,0,112,97,114,116,110,101,114,0>>

【讨论】:

【参考方案2】:

正如 Erlang 参考手册的Escape Sequences 部分所述,Erlang 不支持\uXXXX 转义格式,仅支持\xXX(正好两位数)和\xXXXX(可变位数)。

至于你的问题:

表示一次\u0000转换为&lt;&lt;0&gt;&gt;一次转换为&lt;&lt;131,107,0,17,117,48,48,48,48&gt;&gt;作为句子的第一个字符,117,48,48,48,48和句子的结尾。

这里发生的是term_to_binary 在External Term Format 中创建了一个二进制文件。外部术语格式始终以 131 字节开头,后跟一个类型字节。 107 是字符串的类型字节,它的表示以两个字节的大端长度开始 - 所以这里的0,17 表示字符串的长度是 17 个字节。 117,48,48,48,48 代表 u0000\u 是一个未知的转义序列,所以它就变成了u,并且反斜杠被忽略了。

因此,如果您想准确获取&lt;&lt;0,112,97,114,116,110,101,114,0&gt;&gt;,则可能需要list_to_binary,或者如果您的字符串中可能包含Unicode 字符,则可能需要unicode:characters_to_binary

> Text = "\x0000partner\x0000".
[0,112,97,114,116,110,101,114,0]
> list_to_binary(Text).
<<0,112,97,114,116,110,101,114,0>>
> unicode:characters_to_binary(Text).
<<0,112,97,114,116,110,101,114,0>>

或者,跳过字符串并立即创建二进制文件:

> Bin = <<"\x0000partner\x0000">>.     
<<0,112,97,114,116,110,101,114,0>>

【讨论】:

以上是关于Erlang - 如何将 \u0000 字符转换为二进制?的主要内容,如果未能解决你的问题,请参考以下文章

如何将0x0000之类的字符串转换为int

如何在 Erlang 中将重音字符串转换为常规字符串?

如何将 2020-08-17 02:18:34+0000 转换为 Oracle DATE 类型

使用相同的表示将二进制字符串转换为int

将“ff0000”之类的字符串转换为目标c中的十六进制数

使用字符串格式“Sun, 08 Jan 2012 13:57:38 +0000”将 NSString 转换为 NSDate