Discuss / Java / 能给我解释下为什么结果是97

能给我解释下为什么结果是97

Topic source
public static void main(String[] args) throws UnsupportedEncodingException {		byte[] bytes = "a".getBytes("UTF-8");		for (byte b:bytes) {			System.out.println(b);//97		}	}

为什么是97?中间经历了哪些过程?不明白啊

ANGERIED

#2 Created at ... [Delete] [Delete and Lock User]
char a = 'a'; //按Unicode编码,是一串二进制数 010101010....int a1 = (int) a; //97 将二进制转成十进制

97 就是a啊

看字符码表就知道了

好奇 中文 显示 什么 我去 试试。。。

中国 显示 :中国  

-28-72-83      -27-101-67

三个字节拆开了,byte 一个字节 怎么 表示 3个字节呢。。。

还是去看看 我之前找的文章吧、、、、、

忍不住:说详细点吧: 

已知 中文 的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  一定是我有什么地方没搞明白。。。。好像什么补码还是反码来着。。。记得廖大还回过我

11100100

负数按 补码 存储,所以转换为byte之后的真值为1 0011011  +1  =  1 0011100(由补码求原码,按位取反末位加1),即-28

🌙

#7 Created at ... [Delete] [Delete and Lock User]

之前真是闲的蛋疼...总结 就是 计算机以补码存储数据

peterjxl

#8 Created at ... [Delete] [Delete and Lock User]

回复:求女票上微博

老师和同学们好!看到有人讨论字符编码的关系,我忍不住回答下,因为我自己也花了很少时间去研究和学习,我这里摘录我部分博客内容:

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 ;(非广告,如果廖老师觉得不合适我可以删掉该链接重新编辑该回答)

🌙

#9 Created at ... [Delete] [Delete and Lock User]

谢谢回答,先来看io,为什么呢?学数据结构需要

牛逼!!!


  • 1

Reply