• 关于java中的编码问题


    ok,今天搞了一天都在探索java字符的编码问题.十分头疼.最后终于得出几点:

      1.网上有很多博客说判断一个String的编码的方法是通过如下代码;但其实这个代码完全是错的,用一种编码decode后,再encode,最后的结果是完全一样的.所以下面这个代码,不管用什么编码方式,结果都是true.

    1. String encode = "GB2312";      
    2.       try {      
    3.           if (str.equals(new String(str.getBytes(encode), encode))) {      
    4.                String s = encode;      
    5.               return s;      
    6.            }      
    7.        } catch (Exception exception) {      
    8.        }      
    9.        encode = "ISO-8859-1";      
    10.       try {      
    11.           if (str.equals(new String(str.getBytes(encode), encode))) {      
    12.                String s1 = encode;      
    13.               return s1;      
    14.            }      
    15.        } catch (Exception exception1) {      
    16.        }     

      2.接下来我要说一下我通过实验的出来的结论:java String中的编码方式其实是unicode编码,也就是utf-16编码.当然看到网上很多说法说unicode编码和utf-16编码不一样,但是通过在java中的测试,utf-16编码就是unicode编码,测试代码如下;

    System.out.println(StandardCharsets.UTF_16.aliases());    //这个的输出结果是:[utf16, UnicodeBig, UTF_16, unicode]
     3.我是怎么得到String中的编码都是unicode编码的:
          首先我看了Charset.encode()和Charset.decode()这俩个方法,这俩个方法其实就是在将数据在特定的编码与unicode编码之间转换:将使用某种特定编码的byte流decode成
    unicode编码的char[],那可以想象,这个转换其实是彻底的改变了byte流的数据,也就是直接按照编码之间的映射关系,对byte流直接做了修改.然后decode的原理相同,只是方向相反,将
    unicode编码的数据直接修改,转换成了某种特定的编码所编码过后的数据.据此可以判断,java在识别char的时候,其实就是按照unicode的编码方式来识别byte流的.
          再然后我粗略的看了一下String的构造函数还有getBytes函数的源码,当然源码真的十分复杂,看起来很费劲,所以我只是粗略的看了个大概,然后就可以想象其中的原理了.首先在
    在构造String的时候,我们传进去了一个特定的Charset,然后看到在构造函数里调用了这个函数的encode方法,对byte[]进行的encode操作,当然,按照上面所说的,encode操作其实就是将某
    种特定编码的byte数据转换成了unicode编码的数据.所以说,String中的编码其实全部都是unicode编码.
          然后我看了一下getbytes函数的源码,同样,在这个函数里调用了charset的decode方法,将String中的char[]转换成了特定编码的byte[].那这也进一步证明了String中的数据
    确实是由unicode编码编码的.
    4.最后把这个原理用在实践中有什么用处呢.当我们从外部读入数据时,不管是读文件还是从网络流中读数据,当然如果直接按数据流一样读入后,读入的数据还保持着原来的编码方式,但如果我
    们想把数据放入char[]中打印出来或进行字符处理的话,就会出错.所以要想进行字符操作,就要指定数据源的编码类型,然后将数据重新进行编码.
    5.如何输出特定编码方式的数据.其实这个很简单,如果我们的处理后的数据的编码方式就是我们想要的编码方式的话,直接输出就好了.但如果不是的话,可以先把它转成unicode编码,然后再
    转成我们想要的编码的byte[]流,然后直接输出去.在转换编码的时候,不建议直接使用Charset中的decode和encode,因为返回的buffer往往都比实际的数据要大,根据源码,我看到在返回buffer
    的时候,并没有对buffer进行trim操作.建议使用String的getBytes方法.通过看源码,发现在源码中有trim的操作.长度是通过decode来返回的.decode的具体实现还没有
    看完.
  • 相关阅读:
    phpcms V9 联动菜单的调用
    【转】雷军:扁平化管理 不打卡不设KPI
    【转】 Json转换利器Gson之实例五-注册TypeAdapter及处理Enum类型
    【转】Json转换利器Gson之实例四-实际开发中的特殊需求处理
    【转】 Json转换利器Gson之实例三-Map处理
    【转】 Json转换利器Gson之实例二-Gson注解和GsonBuilder
    【转】Json转换利器Gson之实例一-简单对象转化和带泛型的List转化
    【转】工作分解结构在软件开发中的应用
    【转】 IT项目管理的三个条件、五个步骤
    【转】 项目组内个角色的职责说明
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/5678460.html
Copyright © 2020-2023  润新知