定义
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。
范围
由rfc3629标准定义的范围为:U+0000到U+10FFFF。
编码规则:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。
| Unicode范围 | utf-8 | 字节数(byte) | 备注 |
|---|---|---|---|
| U+0000 - U+007F | 1 | 1字节=8位=256个。因为0被定死了,所以只有128个(0-127, U+007F=127)。 | |
| U+0080 - U+07FF |
|
2 | 110x 其中11为字节数个1(字节数为n, 则n个1),0为固定值。 |
| U+0800 - U+FFFF |
|
3 | |
| U+10000 - U+1FFFFF |
|
4 | 因为rfc3629规定,实际用到的范围只有U+10000 - U+10FFFF。 |
javascript 判断utf8字符串的字节数
function getUTF8Byte(str) {
if (!str) {
return 0
}
let byteCount = 0
for (let i = 0; i < str.length; i++) {
const ascii = str.charCodeAt(0)
if (ascii <= 0x007F) {
byteCount++
} else if (ascii <= 0x07FF) {
byteCount += 2
} else {
byteCount += 3
}
// utf8 被RFC 3629规范为只能到0x10FFFF, 所以以下判断就没用了
// else if (ascii <= 0xFFFF) {
// byteCount += 3
// }
// else if (ascii <= 0x1FFFFF) {
// byteCount += 4
// } else if (ascii <= 0x3FFFFFF) {
// byteCount += 5
// } else if (ascii <= 0x7FFFFFFF) {
// byteCount += 6
// }
}
return byteCount
}