String与byte[]字节数组中⽂转换乱码问题
原⽂地址:wwwblogs/hy928302776/archive/2013/04/20/3032728.htm
blog.csdn/vipclx/article/details/8029410
在Java中,Bytes(String decode)⽅法会根据指定的decode编码返回某字符串在该编码下的byte数组表⽰,如
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编码下的byte数组表⽰,此时b_gbk的长度为2,b_utf8的长度为
3,b_iso88591的长度为1,b_unicode 的长度为4(系统的的unicode采⽤的是big-endian就是前⾯是两个
字节来表⽰这个的,unicode 采⽤的都是两个字节编码,所以后⾯是4个字节 )。
⽽与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()来还原就⽆从谈起了。
因此,通过Bytes(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(Bytes(“ISO8859-1”),“UTF-8”)来得到正确的中⽂汉字“中”。这样就既保证了遵守协议规定、也⽀持中⽂。
String的getBytes()⽅法是得到⼀个字串的字节数组,这是众所周知的。但特别要注意的是,本⽅法将返回该操作系统默认的编码格式的字节数组。如果你在使⽤这个⽅法时不考虑到这⼀点,你会发现在⼀个平台上运⾏.良好的系统,放到另外⼀台机器后会产⽣意想不到的问题。
java中utf-8编码的byte数组转换成String类型代码
private String utfToString(byte[] data){
String str =null;
数组转换成字符串
try{
str =new String(data,"utf-8");
}catch(UnsupportedEncodingException e){
}
return str;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。