能给我解释下为什么结果是97
Topic source忍不住:说详细点吧:
已知 中文 的Unicode 编码是 x4E2D(01001110 00101101); x6587(01100101 10000111);
求:中文 的utf-8 编码是多少?
参考:字符编码笔记:ASCII,Unicode 和 UTF-8 - 阮一峰的网络日志 (ruanyifeng.com)
转换公式:1110xxxx 10xxxxxx 10xxxxxx
可以得出结果为:11100100 10111000 10101101(中)(文 自己计算吧)
在字符转换为byte数组 遍历结果:(我靠,我计算结果怎么卡住了:为什么我的结果是:-100,-56,-45)
28+100 72+56 83+45 都等于 128 一定是我有什么地方没搞明白。。。。好像什么补码还是反码来着。。。记得廖大还回过我
回复:求女票上微博
老师和同学们好!看到有人讨论字符编码的关系,我忍不住回答下,因为我自己也花了很少时间去研究和学习,我这里摘录我部分博客内容:
UTF-8的编码规则很简单,只有2个:
- 对于一个字节就能存储的符号,和ASCII的符号表一样(字节的第一位设为0,后面7位为这个符号的Unicode码)
- 对于需要多字节存储的符号,那么第一个字节从最高位开始,连续有几个比特位的值为 1,就使用几个字节编码,剩下的字节均以 10 开头。
那么一个Unicode符号如何转为UTF8呢?步骤如下:
* 首先将 16 进制的码点,通过进制转换 为十进制
* 然后使用十进制的数字查找上述表格处于哪个范围中,得出编码规则。
* 然后将码点转换为 2 进制,从低位到高位替换 x 即可得到字二进制的原码
* 将二进制的原码转换为补码存储。
举个例子,汉字“严”的Unicode是十六进制数4E25,十进制为20005,需要3个字节,二进制数为(0100 1110 0010 0101)。
我们分别将这15个二进制,填充到 `1110 xxxx 10xx xxxx 10xx xxxx` 中的x中(不足的补0),得到的结果:
1110 xxxx 10xx xxxx 10xx xxxx
0100 11 1000 10 0101
1110 0100 1011 1000 1010 0101
对三个字节分别求补码,得到
原码:11100100 10111000 10100101
取反:00011011 01000111 01011010
加一:00011100 01001000 01011011
这几个分别是-28,-72,-91的补码。
可以用代码验证下,确实是输出这3个数。
byte[] b2 = "严".getBytes("utf-8");
for (int i = 0; i < b2.length; i++) {
System.out.println(b2[i]);
}
我自己写了一个字符编码系列的博客,感兴趣的可以去看看:简单聊聊Unicode ;(非广告,如果廖老师觉得不合适我可以删掉该链接重新编辑该回答)
- 1
表搞切捏三
为什么是97?中间经历了哪些过程?不明白啊