Erlang中\u0000字符与二进制格式互转问题
问题根源
- 误用
term_to_binary/2:该函数输出的是Erlang专属的外部术语序列化格式,包含格式元数据头,不是无格式的业务二进制流,你得到的结果开头的131就是Erlang外部术语格式的固定魔数,自然和外部服务返回的纯业务二进制不匹配 - 字符串转义写法错误:Erlang默认不识别
"\u0000"这类转义写法,你写的"\u0000partner\u0000"实际被解析成了\、u、0、0、0、0、p、a...共6+7+6=19个字符组成的整数列表,没有生成你需要的单个0码点
互相转换实现
1. 字符串转目标二进制 <<0,112,97,114,116,110,101,114,0>>
首先用正确的写法定义含0码点的Erlang字符串(Erlang字符串本质是整数列表):
% 写法1:直接拼接整数列表 Text = [0] ++ "partner" ++ [0]. % 写法2:用十六进制转义(需开启Unicode支持,Erlang/OTP R16及以上默认开启) Text = "\x{0}partner\x{0}".
再通过Unicode编码转换得到目标二进制:
% 因为你的字符都在ASCII范围内,UTF-8编码和ASCII编码结果完全一致 Bin = unicode:characters_to_binary(Text, utf8, utf8). % 输出结果就是你需要的 <<0,112,97,114,116,110,101,114,0>>
2. 外部接收的二进制转回Erlang字符串
% 假设从外部服务拿到的Payload为 <<0,112,97,114,116,110,101,114,0>> Text = unicode:characters_to_list(Payload, utf8). % 输出结果为 [0,112,97,114,116,110,101,114,0],即目标字符串
轻量替代方案(无需调用unicode模块)
如果是简单的ASCII/UTF-8兼容场景,也可以用列表推导手动实现转换:
% 字符串转二进制 TextToBin = fun(Text) -> << <<C/utf8>> || C <- Text >> end. % 二进制转字符串 BinToText = fun(Bin) -> [C || <<C/utf8>> <= Bin] end.
内容的提问来源于stack exchange,提问作者Arrow
相关产品推荐
相关产品推荐

