Java中详解字符串类型与默认字符编码

  

  

至于为什么要写这个,主要是一句mmp一定要讲,绕了一上午,晕死
  Java程序中的中文乱码问题一直是一个困扰程序员的难题,自己也不例外,早在做项目时就遇到过很多编码方式的坑,当时想填来着,但是嫌麻烦。这次终于忍不住了,一定要弄个明白

  

  

从网上查的资料都说,Java默认的字符编码是Unicode,而字符串类型的编码方式是与JVM编码方式和本机操作系统默认字符集有关的。于是我做出了测试
  在Java中可以这样显示查看本地编码方式(JVM还是操作系统呢?)
  

     //获取指定关键的系统属性表示。   System.out.println (System.getProperty (file.encoding));      

看注释上说是获取系统字符集,但是我对这个系统的概念表示存疑,为什么呢,因为众所周知,我们中国人的电脑大部分默认的字符编码方式就是GBK,在CMD中输入chcp可以获得一个数值936,这就表示了是GBK的编码方式。

  

但是我自己运行出这句话的结果竟然是utf - 8,我是在想法中运行的,并且已经使用想法设置了项目的编码方式是utf - 8,出现这样的结果我只能是猜测其实上面这句话是获取JVM(跟随项目的编码方式)的编码方式

  

接下来我们来回归正题,字符串类型的默认编码方式是什么,有下面这几句语句:
  

     /*测试字符串类型默认的编码方式   *///使用字符串的有参构造方法   字符串str=新的字符串(“hhhh泰字符智障% shfu摸淑芬十分uif内服NSF黑”);//1 .以GBK编码方式获取str的字节数组,再用字符串有参构造函数构造字符串   system . out。println(新的字符串(str.getBytes (“GBK”)));//2 .以utf - 8编码方式获取str的字节数组,再以默认编码构造字符串   system . out。println(新的字符串(str.getBytes (“utf - 8”)));   之前      

下面来看一下运行结果:

  
  

//1。
  hhhh泰字符# 65533;& # 65533;& # 65533;& # 65533;% shfu& # 65533; & # 65533; & # 65533; & # 65533; & # 65533; & # 686; & # 65533; & # 65533; uif& # 65533; & # 1719; & # 65533; nsf # 65533; & # 65533;我# 65533;& # 65533;& # 65533;& # 65533;& # 1592;& # 65533;& # 65533;& # 65533;u # 65533; & # 65533; & # 938; & # 65533; & # 65533; & # 1596; u & # 65533; & # 65533;δ& # 65533;& # 65533;& # 65533;δ& # 65533;& # 65533;& # 65533;hhhh泰字符智障% shfu摸淑芬十分uif内服NSF黑我飞鸟回复额你发为呢丶你房未婚夫未婚夫
//2。
  hhhh泰字符智障% shfu摸淑芬十分uif内服NSF黑我飞鸟回复额你发为呢丶你房未婚夫未婚夫
  

     

,可以很明显的可以看的出,这类里字符串型默认的字符编码方式就是与我们查看本地系统的编码方式相同。因此我们得出结论:字符串类型的默认编码方式是和本地编码方式相关

  

  

我们大多数情况下是不使用字符串类型的,而是使用字节数组来传输操作数据,一般会使用String.getBytes()方法来将字符串转换成字节数组。但是这样转换的时候,会不会牵涉到编码问题呢?仔细查看了String.getBytes()的源码,分为无参的和有参的两种:
  

     //1 .无参的getBytes()方法   公共byte [] getBytes () {//再继续深入编码()方法可以发现使用的是系统默认的字符编码   StringCoding返回。编码(值,0,value.length);   }//2。带参数的getBytes(字符串charsetName)方法   公共byte [] getBytes(字符串charsetName)   抛出UnsupportedEncodingException {   如果(charsetName==null)把新NullPointerException ();//继续深入可以发现,会使用参数字符集编码方式来返回字节数组,如果参数字符集不存在,则使用本地系统默认的字符编码   StringCoding返回。编码(charsetName值0,value.length);   }   之前      

综上,在这里再强调一下,因为修改了项目的编码方式,导致了本地系统的编码方式也变成了utf - 8,所以上述的实验都是基于IDE修改了工程项目编码方式的基础上

  

  

在NIO中,一般都是使用ByteBuffer来当作字符缓冲,而有的时候我们只[]有字节数组,所以是需要它们之间进行相互转换的
  

     //ByteBuffer——比;byte []   byte[]字节=ByteBuffer.array ();//byte[] - - - - - -在ByteBuffer   byte[]字节=新字节[1024];   ByteBuffer ByteBuffer=ByteBuffer.wrap(字节);   之前      

  

综上所述,再在这里总结一下:

Java中详解字符串类型与默认字符编码