水滴石穿——非一日之功

new String(getBytes(ISO-8859-1),UTF-8)中文编码避免乱码

    byte[] b_gbk = "深".getBytes("GBK");   
    byte[] b_utf8 = "深".getBytes("UTF-8");   
    byte[] b_iso88591 = "深".getBytes("ISO8859-1");   
    byte[] b_unicode = "深".getBytes("unicode");  

将分别返回“深”这个汉字在GBK、UTF-8、ISO8859-1和unicode编码下的byte数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1,unicode为4。     而与getBytes相对的,可以通过new String(byte[], decode)的方式来还原这个“深”字时,这个new String(byte[], decode)实际是使用decode指定的编码来将byte[]解析成字符串。

String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,

    String s_gbk = new String(b_gbk,"GBK");   
    String s_utf8 = new String(b_utf8,"UTF-8");   
    String s_iso88591 = new String(b_iso88591,"ISO8859-1");   
    String s_unicode = new String(b_unicode, "unicode");  

通过打印s_gbk、s_utf8、s_iso88591和unicode,会发现,s_gbk、s_utf8和unicode都是“深”,而只有s_iso88591是一个不认识的字符,为什么使用ISO8859-1编码再组合之后,无法还原“深”字呢,其实原因很简单,因为ISO8859-1编码的编码表中,根本就没有包含汉字字符,当然也就无法通过"深".getBytes("ISO8859-1");来得到正确的“深”字在ISO8859-1中的编码值了,所以再通过new String()来还原就无从谈起了。 

    因此,通过String.getBytes(String decode)方法来得到byte[]时,一定要确定decode的编码表中确实存在String表示的码值,这样得到的byte[]数组才能正确被还原。 

  有时候,为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1编码)和tomcat中全部用ISO-8859-1编码,可能会通过将中文字符按照字节方式来编码的情况,如 

    String s_iso88591 = new String("深".getBytes("UTF-8"),"ISO8859-1"), 

    这样得到的s_iso8859-1字符串实际是三个在 ISO8859-1中的字符,在将这些字符传递到目的地后,目的地程序再通过相反的方式String s_utf8 = new String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")来得到正确的中文汉字“深”。这样就既保证了遵守协议规定、也支持中文。 

String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示

这里是encode ,not decode,从字符串到字节数组是编码的过程,从字节数组到字符串(即 new String(byte[] , charsetname))才是解码的过程,byte[]中存的才是码

 

那么我们可以得到一个编码转换的过程 
假设:GBK码("你")->URLencode后变成->(%3F%2F)->Tomcat自动替你转一次ISO-8859-1->得到字符串( 23 43 68 23 42 68 每一个符号表示为ISO-8859-1中的一个编码)->接收页面--->再转一次为ISO-8859-1的Byte数组[23,43,68,23,42,68]--->用GBK再转为可读的文字--->(%3F%2F"---->转为("你")     =>即为new String(getBytes(ISO-8859-1),UTF-8)

posted @ 2019-06-14 14:16  滑稽的鼠标  阅读(5612)  评论(0编辑  收藏  举报
/*粒子线条,鼠标移动会以鼠标为中心吸附的特效*/