You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:54:04