Kotlin字符串转二进制代码处理非拉丁字符报错如何兼容全字符?
问题分析
- 你写的代码能正常处理ASCII字符完全是巧合:你将字符码点转换得到的二进制字符串,直接当做十进制数值传入
Integer.parseInt()解析,再用%08d补前导0,刚好和ASCII字符的8位二进制表示结果一致。 - 非拉丁字符的Unicode码点远大于127,转换得到的二进制字符串长度超过10位时,作为十进制数值解析会超过int类型的最大值(2147483647),直接触发
NumberFormatException报错。 - 强制统一补8位的逻辑不适用于多字节的Unicode字符,你可以根据实际需求选择下面两种实现方案:
方案1:输出UTF-8编码对应的二进制序列(通用场景推荐)
这个方案会先将字符串转为UTF-8编码的字节数组,每个字节固定输出8位二进制,兼容所有语言字符:
fun strToBinary(str: String): String { val builder = StringBuilder() str.toByteArray(Charsets.UTF_8).forEach { byte -> // 转为无符号字节后转二进制,高位补0到8位 val binary = byte.toUByte().toString(2).padStart(8, '0') builder.append(binary) } return builder.toString() }
方案2:输出每个字符Unicode码点的二进制表示
如果你的需求是单个字符对应一串二进制,可选择固定16位(覆盖所有常用BMP字符)或32位(覆盖所有Unicode字符)补齐:
fun strToBinary(str: String): String { val builder = StringBuilder() str.forEach { char -> // 这里padStart的参数可根据需要调整为16/32 val binary = char.code.toString(2).padStart(32, '0') builder.append(binary) } return builder.toString() }
内容的提问来源于stack exchange,提问作者Zumatra Hia
相关产品推荐
相关产品推荐

