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转换为
<<0>>
一次转换为<<131,107,0,17,117,48,48,48,48>>
作为句子的第一个字符,117,48,48,48,48
和句子的结尾。
这里发生的是term_to_binary
在External Term Format 中创建了一个二进制文件。外部术语格式始终以 131 字节开头,后跟一个类型字节。 107 是字符串的类型字节,它的表示以两个字节的大端长度开始 - 所以这里的0,17
表示字符串的长度是 17 个字节。 117,48,48,48,48
代表 u0000
。 \u
是一个未知的转义序列,所以它就变成了u
,并且反斜杠被忽略了。
因此,如果您想准确获取<<0,112,97,114,116,110,101,114,0>>
,则可能需要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 字符转换为二进制?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 2020-08-17 02:18:34+0000 转换为 Oracle DATE 类型
使用字符串格式“Sun, 08 Jan 2012 13:57:38 +0000”将 NSString 转换为 NSDate