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

Erlang中string:length函数处理含'â'二进制数据为何异常?

为何含'â'的二进制调用string:length失败,转列表却正常?

核心原因

Erlang的string:length/1函数只接受字符列表(Erlang里的"字符串"本质就是字符列表,类型为list())作为输入,它并不原生支持二进制(binary()类型)参数。

具体拆解

  • 二进制的兼容局限:
    部分Erlang版本对纯ASCII二进制做了有限兼容,能把单字节的ASCII二进制当作字符列表处理。但像'â'这种UTF-8字符是双字节编码(对应二进制<<195,162>>),string:length无法识别这两个字节是单个字符,会判定输入不符合要求,直接抛出bad argument错误。
  • 转列表后的适配:
    binary_to_list(Bin)会把UTF-8二进制解码成Unicode字符列表,每个字符(包括'â')都是列表里的一个独立元素。这种格式完全符合string:length/1的参数要求,所以能正确统计出字符总数(示例里"â Hello"一共7个字符)。

代码验证

错误场景:

> Bin = <<"â Hello">>.
> string:length(Bin).

** exception error: bad argument: <<"â Hello">>
     in function  string:length_1/2 (string.erl, line 557)

正确场景:

> Str = binary_to_list(Bin).
> string:length(Str).
7

更便捷的替代方法

如果要直接计算二进制的字符长度,不用转列表,推荐用支持二进制的unicode:strlen/1:

> unicode:strlen(<<"â Hello">>).
7

内容的提问来源于stack exchange,提问作者spkhaira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:13:18