String.getBytes()方法中的中文编码问题
String的getBytes()方法是得到一个系统默认的编码格式的字节数组
getBytes(\"utf-8\") 得到一个UTF-8格式的字节数组
把String转换成bytes,各种编码转换成的bytes不同,比如UTF-8每个汉字转成3bytes,而GBK转成2bytes,所以要说明编码方式,否则用缺省编码。
都是将一个string类型的字符串转换成byte类型并且存入一个byte数组中。
在java中的所有数据底层都是字节,字节数据可以存入到byte数组。
存储字符数据时(字符串就是字符数据),会先进行查表,然后将查询的结果写入设备,读取时也是先查表,把查到的内容打印到显示设备上
getBytes()是使用默认的字符集进行转换,getBytes(“utf-8”)是使用UTF-8编码表进行转换。
在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这表示在不同的操作系统下,返回的东西不一样!
String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如:
byte[] b_gbk = \"中\".getBytes(\"GBK\");
byte[] b_utf8 = \"中\".getBytes(\"UTF-8\");
byte[] b_iso88591 = \"中\".getBytes(\"ISO8859-1\");
将分别返回\"中\"这个汉字在GBK、UTF-8和ISO8859-1编码下的byte数组表示,此时
b_gbk的长度为2,
b_utf8的长度为3,
b_iso88591的长度为1。
而与getBytes相对的,可以通过new String(byte[], decode)的方式来还原这个\"中\"字,
这个new String(byte[], 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\");
通过输出s_gbk、s_utf8和s_iso88591,会发现s_gbk和s_utf8都是\"中\而只有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编码),可能会通过将中文字符按照字节方式来编码的情况,如:
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\")来得到正确的中文汉字\"中\",这样就既保证了遵守协议规定、也支持中文。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务