utf8编码-汉字几字节

UTF-8 编码字符理论上可以最多到 6个字节长,但目前全世界的所有文字和符号种类加起来也只要编到 4个字节长就够了。UTF-8 是以 8位(即 1个字节)为单元对原始码进行编码(注意一 点:这里所讲的原始码都是指Unicode码),并规定:多字节码(2个字 节以上才称为多字节)以转换后第1个字节起头的连续“1”的数目(这 些连续“1”称为标记位),表示转换成几个字节:“110”连续两个 “1”,表示转换结果为2个字节,“1110”表示3个字节,而“11110” 则表示4个字节……跟随在标记位之后的“0”,其作用是分隔标记位和 字符码位。第2~第4个字节的起头两个位固定设置为“10”,也作为标 记,剩下的6个位才做为字符码位使用。
   这样,2字节UTF-8码剩下11个字符码位,可用以转换0080~07FF的 原始字符码,3字节剩下16个字符码位,可用以转换0800~FFFF的原始字 符码,由此类推。编码方式的模板如下:

 原始码(16进制) UTF-8编码(二进制)
 --------------------------------------------
 0000 - 007F 0xxxxxxx
 0080 - 07FF 110xxxxx 10xxxxxx
 0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
 ……
 --------------------------------------------

   模板中的“x”表示字符码。Ascii码<007F,编为1个 字节的UTF-8码。汉字的 Unicode编码范围为0800-FFFF,所以被编为 3个字节的UTF-8码。


   例如“汉”字的Unicode编码是6C49,6C49在0800-FFFF之间,所以 要用3个字节的模板:1110wwww 10xxxxyy 10yyzzzz。

 6 C 4 9
 0110 1100 0100 1001
 wwww xxxx yyyy zzzz
 wwww xxxxyy yyzzzz
 1110wwww 10xxxxyy 10yyzzzz。
 11100110 10110001 10001001

 E 6 B 1 8 9

“汉”字的UTF-8编码是E6 B1 89

### UTF-8 编码中文字符的字节用规则 UTF-8 是一种可变长度的字符编码方式,能够使用 1 到 4 个字节来表示一个字符。具体到中文字符,在 Unicode 标准中,大部分常用汉字位于 BMP(Basic Multilingual Plane)平面内,其范围为 U+4E00 至 U+9FFF 和扩展区 A-F(U+3400-U+4DBF, U+20000-U+2A6DF 等)。这些字符通常由 3 或 4 个字节组成。 #### 常见中文字符的字节用情况 1. **GB2312/GBK 范围内的汉字** 大部分 GBK 编码支持的汉字属于 Unicode 的 BMP 平面,对应范围为 U+4E00 至 U+9FFF。在 UTF-8 编码中,这类字符需要用 **3 个字节** 表示[^5]。 - 编码规则:`1110xxxx 10xxxxxx 10xxxxxx` 2. **超出 BMP 平面的汉字(如生僻字或扩展区域字符)** 对于一些不常见的汉字,尤其是那些位于 Unicode 扩展区 A-F 的字符(例如 U+20000 及以上),则需要 **4 个字节** 来表示[^3]。 - 编码规则:`11110xxx 10xxxxxx 10xxxxxx 10xxxxxx` #### 示例分析 以下是个具体的例子: | 字符 | Unicode 编码 | UTF-8 编码 | 字节数 | |------|--------------|---------------------------|------------| | 中 | U+4E2D | `E4 B8 AD` | 3 | | 文 | U+6587 | `E6 96 87` | 3 | | 龙 | U+9F9F | `E9 BE BF` | 3 | | 和合字| U+20000 | `F0 A0 80 80` | 4 | #### 特殊说明 需要注意的是,虽然 UTF-8 支持多达 4 个字节编码形式,但在实际应用中,大多数现代中文字符仍然集中在 3 字节范围内。只有少数非常罕见的汉字才会需要用到 4 字节编码[^3]。 ```java // Java 示例代码展示如何计算字符串中每个字符的字节数 public class Utf8ByteCounter { public static void main(String[] args) { String chineseText = "中文测试"; for (char ch : chineseText.toCharArray()) { System.out.printf("Character: %c -> Byte Length: %d%n", ch, getUtf8Length(ch)); } } private static int getUtf8Length(char ch) { if ((ch >= '\u0001') && (ch <= '\u007F')) return 1; else if ((ch >= '\u0080') && (ch <= '\u07FF')) return 2; else if ((ch >= '\u0800') && (ch <= '\uFFFF')) return 3; else return 4; // For supplementary characters beyond the Basic Multilingual Plane. } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lazyclough

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值