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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:27:00