【问题标题】: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>>

【问题讨论】:

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

标签: unicode erlang


【解决方案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(正好两位数)和\x{XXXX}(可变位数)。

    至于你的问题:

    表示一次\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_binaryExternal 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 = "\x{0000}partner\x{0000}".
    [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 = <<"\x{0000}partner\x{0000}">>.     
    <<0,112,97,114,116,110,101,114,0>>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-09
      • 2012-03-14
      • 2013-11-26
      • 2021-02-24
      • 2013-09-19
      • 2012-01-06
      相关资源
      最近更新 更多