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
相关产品推荐
相关产品推荐

