下面代码将字符串用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]