Java (PostgreSQL-JDBC) UTF-8 转 Unicode 实例
postgresql-jdbc-9.1-902.src\org\postgresql\core\UTF8Encoding.java
在 Java 中, 字节序列是以补码的形式存在
例如, "中".getBytes("UTF-8") 的结果为 [-28, -72, -83], 而实际的 UTF8 编码的 16 进制为 [E4, B8, AD], 十进制为 [228, 184, 173], 其中 228 = 256 (模) - |-28| (绝对值)
由已知 UTF8 编码来计算 UNICODE (UTF16BE) 的转换方式
1. 确定 "中" 字 UTF8 编码的格式
1110xxxx 10xxxxxx 10xxxxxx
2. UTF8 编码中每个字节的二进制填入 1 中的 x 对应位置
2-1. 第 1 字节 -28 的二进制编码
-28 = 256 - |-28| = 228 = 11100100
-72 = 256 - |-72| = 184 = 10111000
-83 = 256 - |-83| = 173 = 10101101
2-2. 将第 1 字节编码做位移
11100100 & 0x0f = 0100 << 12 = 01000000 00000000
其中
0x0f 对应 1 中的 1110xxxx, 即 x 设为 1, 其余为 0
12 对应 1 中后面字节中的 x 的个数, 即左移 12 位
2-3. 将第 2 字节编码做位移
10111000 & 0x3f = 111000 << 6 = 1110 00000000
其中
0x3f 对应 1 中的 10xxxxxx, 即 x 设为 1, 其余为 0
6 对应 1 中后面字节中的 x 的个数, 即左移 6 位
2-3. 将第 3 字节编码做位移
10101101 & 0x3f = 101101 << 0 = 101101
2-4. 将 2-1 到 2-3 的结果按位做或运算, 位数不足前免用 0 补齐
01000000 00000000 | 1110 00000000 | 101101 = 01001110 00101101 = [78, 45] (十进制) = [4E, 2D] (十六进制)
postgresql-jdbc-9.1-902.src\org\postgresql\core\UTF8Encoding.java
在 Java 中, 字节序列是以补码的形式存在
例如, "中".getBytes("UTF-8") 的结果为 [-28, -72, -83], 而实际的 UTF8 编码的 16 进制为 [E4, B8, AD], 十进制为 [228, 184, 173], 其中 228 = 256 (模) - |-28| (绝对值)
由已知 UTF8 编码来计算 UNICODE (UTF16BE) 的转换方式
1. 确定 "中" 字 UTF8 编码的格式
1110xxxx 10xxxxxx 10xxxxxx
2. UTF8 编码中每个字节的二进制填入 1 中的 x 对应位置
2-1. 第 1 字节 -28 的二进制编码
-28 = 256 - |-28| = 228 = 11100100
-72 = 256 - |-72| = 184 = 10111000
-83 = 256 - |-83| = 173 = 10101101
2-2. 将第 1 字节编码做位移
11100100 & 0x0f = 0100 << 12 = 01000000 00000000
其中
0x0f 对应 1 中的 1110xxxx, 即 x 设为 1, 其余为 0
12 对应 1 中后面字节中的 x 的个数, 即左移 12 位
2-3. 将第 2 字节编码做位移
10111000 & 0x3f = 111000 << 6 = 1110 00000000
其中
0x3f 对应 1 中的 10xxxxxx, 即 x 设为 1, 其余为 0
6 对应 1 中后面字节中的 x 的个数, 即左移 6 位
2-3. 将第 3 字节编码做位移
10101101 & 0x3f = 101101 << 0 = 101101
2-4. 将 2-1 到 2-3 的结果按位做或运算, 位数不足前免用 0 补齐
01000000 00000000 | 1110 00000000 | 101101 = 01001110 00101101 = [78, 45] (十进制) = [4E, 2D] (十六进制)
0 件のコメント:
コメントを投稿