UTF8 Memo

Fri Apr 11 2025

下面代码将字符串用utf8编码,并输出2进制表示的字节数组。

    private fun String.toUtf8(): List<String> {
        return toByteArray(Charsets.UTF_8).map {
            it.toInt().and(0xFF).toString(2).padStart(8, '0')
        }
    }
首字节二进制模式 字节数 编码范围 描述 示例字符
0xxxxxxx 1 字节 U+0000 ~ U+007F ASCII 字符 A(0x41)
110xxxxx 2 字节 U+0080 ~ U+07FF 拉丁扩展、希腊文等 é(0xC3A9)
1110xxxx 3 字节 U+0800 ~ U+FFFF 日文、韩文、汉字等 (0xE38182)
11110xxx 4 字节 U+10000 ~ U+10FFFF Emoji、罕见汉字、符号等 😊(0xF09F988A)
  • 0xxxxxxx → 解码为 ASCII 字符
  • 110xxxxx → 是两字节开头,后面必须跟一个 10xxxxxx
  • 1110xxxx → 是三字节开头,后续必须有两个 10xxxxxx
  • 11110xxx → 四字节开头,后续三个 10xxxxxx

测试

        val text = "Aéあ缝"
        for (char in text) {
            println("$char: ${char.toString().toUtf8()}")
        }
输出
A: [01000001]
é: [11000011, 10101001]
あ: [11100011, 10000001, 10000010]
缝: [11100111, 10111100, 10011101]

← Back to home