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)

最新文章

  1. a标签填充父容器
  2. Codeforces Round #262 (Div. 2) 1003
  3. java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题
  4. HDU 5675 ztr loves math
  5. ora01033 oracle正在初始化或关闭
  6. 在Java中兼容Windows和Linux的路径处理
  7. velocity的foreach下标
  8. java8 泛型声明 The diamond operator ("<>") should be used
  9. springboot 静态方法注入service
  10. C#通过虚方法实现方法重写—多态。
  11. Docker Registry V2 with Nginx
  12. 2-关于单片机通信数据传输(中断接收,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)
  13. Excel学习笔记:if({1,0})用法
  14. Python 字符串(count)
  15. Android MarsDaemon实现进程及Service常驻
  16. Lab6: Paxos
  17. EF中修改对象的值的问题。。。(字段超级多的时候)
  18. Hdu1560 DNA sequence(IDA*) 2017-01-20 18:53 50人阅读 评论(0) 收藏
  19. Spark Pregel参数说明
  20. PHP 通过LDAP协议,操作Windows Active Directory

热门文章

  1. Golang Gin实践 番外 请入门 Makefile
  2. lucene_07_solr使用IK分词器
  3. hdu 4009 最小树形图模板题朱刘算法
  4. ACDream - Dynamic Inversions II
  5. MySQL Study之--MySQL体系结构深入解析
  6. contest hunter 6803 导弹防御塔
  7. SQLite 常用函数
  8. AVL树、splay树(伸展树)和红黑树比较
  9. STEM教育是什么?
  10. hdoj--1151--Air Raid(最大独立集)