java基础-char

2019-05-27  本文已影响0人  16325

Unicode

Unicode编码定义了这个世界上几乎所有字符(就是你眼睛看的字符比如ABC,汉字等)的数字表示,而且Unicode还兼容了很多老版本的编码规范,例如你熟悉的 ASCII码。

码点

注意

Integer.toHexString('你')
得到的结果就是\u4f60。再次强调,这个是utf-16编码,和utf8没有任何关系。

默认utf-8的getByte输出字符长度是3,因为占用3个字节。
改成utf-16变成4了? 而且最后两个字节79,96. 正好就是他的unicode码\u4f60。
但是前两个字节是什么?前面的feff是什么东西呢?

原来FE FF代表 UTF-16BE ,就是大尾序格式,显示的是0061
可以看到我们换成
byte[] bb= a.getBytes("UTF-16BE"); 得到的结果就是0061了
反之
byte[] bb= a.getBytes("UTF-16LE"); 得到的结果就是6100了

结论:getBytes("UTF-16")的byte长度会比我们预期的多2,就是两个byte开头要指定是大尾格式,还是小尾格式

unicode的三种编码方式

(换句话就是码点如何转换为utf-8或者utf-16或者utf-32)

Java中 内码和外码

jvm默认外码:
windows——gbk
Linux——utf-8

Java字符和字符串存在于以下几个地方:
1.Java源码文件,.java,可以是任意字符编码,如GBK,UTF-8
2.Class文件,
.class,采用的是一种改进的UTF-8编码(Modified UTF-8)
3.JVM,内存中使用UTF-16编码

Java中的编码

上边说了一些概念,那么java中的字符编码是怎么设计的呢?

double π = Math.PI;
        System.out.println(\u03C0);

        \u0053ystem.out.println('\u61D2');

u03C0就是π
\u0053就是S

浏览器中的编码

问题:

  1. 变量名称,首字母:英文字母或者美元符或者下划线。非首字母:美元符或者字母或者数字或者下划线组成。那么首字母的范围是不是比非首字母少10个? 也是除了就0到9,首字母和非首字母范围一致?如何验证?

2.char多大?用几个字节表示?能否表示中文?能否表示全部中文?

3.String nin=“恁” ,nin.getBytes().length 为什么等于3,在你同事电脑里可能等于2?是不是这个就是char的真实大小?

4. image.png

截图里的代码,能运行么?会输出什么?

5.在idea或者eclipse里,用gbk或者utf-8保存源文件,编译出来的class文件有区别么?
jvm中是用的编码是和源文件一致么?

6.char s = ‘再' , s+'见' 会得到什么值 ? char st =‘再'+ '见'+ '见' 呢?

7.char uy = '\377'; char uys = '\378'; 这两种定义方式有什么起源?都能成功执行么?

8.unicode和utf-8,utf-16到底什么关系? 什么叫code point?ucs2和ucs4是什么? ucs2能保存全世界所有的字符么?

  1. char a=111 用整数来定义,整数的范围是多少? char和short占用字节大小是否一样? 能否直接转换?

  2. UTF-16的大尾序和小尾序储存格式是什么样子的?

答案:

上一篇 下一篇

猜你喜欢

热点阅读