ByteArrayInputStream和DataInputStream的源码分析和使用方法详细分析前言)UTF-8 编码规则合集 - 【Java—JDK源码】IO的使用和IO相关的源码(14)1
UTF-8Unicode Transformation Format-8-bit是一种针对 Unicode 的可变长度字符编码通过 1 至 4 个字节表示一个字符完美兼容 ASCII 编码同时支持全球所有语言的字符包括中文、日文、韩文、阿拉伯语等。其核心设计思想是通过首字节的标识符确定字符的字节长度后续字节以固定格式标记确保编码的唯一性和可解析性。UTF-8 的编码规则基于 Unicode 码点的范围通过首字节的前几位前缀码标识字符的字节长度后续字节以 10 开头作为延续标记。具体规则如下Unicode码点范围对应UTF-8编码时占用的字节数用UTF-8编码时首字节的格式用UTF-8编码时后续字节格式示例字符UTF-8 编码U0000 ~ U007F10xxxxxxx无A0x41U0080 ~ U07FF2110xxxxx10xxxxxx10xxxxxx * 1é0xC3 0xA9U0800 ~ UFFFF31110xxxx10xxxxxx 10xxxxxx 10xxxxxx * 2中0xE4 0xB8 0xADU10000 ~ U10FFFF411110xxx10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx * 30xF0 0xA0 0xAE 0xB7一、编码步骤详解1.1、中文编码解码步骤1.1.1、汉字“中”的编码步骤以汉字“中”Unicode 码点 U4E2D为例其 UTF-8 编码过程如下①、确定编码模板由于 U4E2D 属于 U0800 ~ UFFFF 范围需使用 3 字节模板1110xxxx 10xxxxxx 10xxxxxx②、码点转二进制U4E2D 的二进制表示为0100 1110 0010 1101高位补零至 16 位。③、填充到步骤①中的编码模板中a、第一个字节取0100填充1110xxxx 填充后的结果为 1110 01000xE4。b、第二个字节取111000填充10xxxxxx 填充后的结果为 1011 10000xB8。c、第三个字节取 101101填充10xxxxxx 填充后的结果为 1010 11010xAD。④、组合步骤③中的所有的填充结果最终汉子“中” 的 UTF-8 编码为 0xE4 0xB8 0xAD。1.1.2、汉字中的解码步骤汉字“中”解码过程和编码过程相反先根据首字节的前缀码确定字节数再提取有效位组合成 Unicode 码点具体步骤如下①、首字节 0xE4 以 1110 开头说明是 3 字节编码模板。②、分别从3个字节中提取各自的有效位总共提取3次a、从第一个字节 1110 01000xE4中取 0100。b、从第二个字节1011 10000xB8 中取 111000。c、从第三个字节1010 11010xAD中取 101101。③、依次组合步骤②中a、b、c提取的码点拼接成有效位0100 1110 0010 1101 → U4E2D在Unicode 码点中表示中。1.2、英文编码解码步骤1.2.1、英文A的编码步骤以英文字母AUnicode 码点 U0041为例其 UTF-8 编码过程如下①、确定编码模板由于 U0041 属于 U0000 ~ U007F 范围需使用 1 字节模板0xxxxxxx②、码点转二进制U0041 的二进制表示为0100 0001高位补零至 8 位。③、填充到步骤①中的编码模板中a、第一个字节取100 0001填充0xxxxxxx填充后的结果为 0100 00010x41。④、组合步骤③中的所有的填充结果最终英文字母A 的 UTF-8 编码为0x41。1.2.2、英文A的解码步骤英文A解码过程和编码过程相反先根据首字节的前缀码确定字节数再提取有效位组合成 Unicode 码点具体步骤如下①、首字节 0x41 以 0 开头说明是 1 字节编码模板。②、只从唯一的1个字节中提取有效位只提取1次a、从第一个字节 0100 00010x41中取 100 0001。③、组合步骤②中a提取的码点拼接成有效位0100 0001 → U0041高位补零至 8 位在Unicode 码点中表示A。1.3、中文中的特殊字符é编码解码步骤1.3.1、中文中的特殊字符é的编码步骤以中文中的特殊字符éUnicode 码点 U00E9为例其 UTF-8 编码过程如下①、确定编码模板由于 U00E9属于 U0080 ~ U07FF 范围需使用 2字节模板110xxxxx 10xxxxxx②、码点转二进制U00E9 的二进制表示为0000 0000 1110 1001高位补零至 16 位。③、填充到步骤①中的编码模板中a、第一个字节取000 11填充110xxxxx填充后的结果为 1100 00110xC3b、第二个字节取10 1001填充10xxxxxx填充后的结果为 1010 10010xA9④、组合步骤③中的所有的填充结果最终中文中的特殊字符é的 UTF-8 编码为0xC3 0xA9。1.3.2、中文中的特殊字符é的解码步骤中文中的特殊字符é解码过程和编码过程相反先根据首字节的前缀码确定字节数再提取有效位组合成 Unicode 码点具体步骤如下①、首字节 0xC3 以 110 开头说明是 2 字节编码模板。②、分别从2个字节中提取各自的有效位总共提取2次a、从第一个字节1100 00110xC3中取 0 0011。b、从第二个字节1010 10010xA9 中取 10 1001。③、依次组合步骤②中a、b提取的码点拼接成有效位