关于字节编码问题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 关于字节编码问题

关于字节编码问题

 2015/5/6 21:56:43  liushuiwuyan  程序员俱乐部  我要评论(0)
  • 摘要:近期在做项目时,遇到如下问题。先看代码:packagetest11;publicclassTestStr{publicstaticvoidmain(String[]args)throwsException{byte[]bytE=newbyte[]{24,-122,61,102,-51,-78,17,126};Stringstr2=newString(bytE);byte[]bytE2=str2.getBytes();for(byteb:bytE2){System.out.print(b+","
  • 标签:问题 编码
近期在做项目时,遇到如下问题。先看代码:
class="java" name="code">
package test11;

public class TestStr {
	public static void main(String[] args) throws Exception {
		byte[] bytE = new byte[]{24, -122, 61, 102, -51, -78, 17, 126};
		String str2 = new String(bytE);
		byte[] bytE2 = str2.getBytes();
		for(byte b:bytE2){
			System.out.print(b + ",");
		}
	}
}

测试结果:
24,63,61,102,-51,-78,17,126,

对于字节数组使用new String(bytE)转换后,再使用String类的getBytes()编码还原,发现编码前后字节数组不一致。经查默认情况下使用UTF-8编码,而UTF-8是可变长度的编码,原来的字节数组就被改变了,而ISO8859-1通常叫做Latin-1,Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中 0~127的字符与ASCII码相同,它是单字节的编码方式,这样第二种方式生成的String里的字节数组就跟原来的字节数组一样(参考文章:http://blog.csdn.net/jiangxinyu/article/details/8228807)。因此将代码修正为如下,可以正常编码:
package test11;

public class TestStr {
	public static void main(String[] args) throws Exception {
		byte[] bytE = new byte[]{24, -122, 61, 102, -51, -78, 17, 126};
		String str2 = new String(bytE,"ISO-8859-1");
		byte[] bytE2 = str2.getBytes("ISO-8859-1");
		for(byte b:bytE2){
			System.out.print(b + ",");
		}
	}
}

在String--byte[]--String处理模式中,使用默认或者其它编码格式都可以;但在String--byte[]--byte[]--String--byte[]处理模式中,涉及字节数组被处理成新的字节数组后多次转换传递时,为了避免字节数组变化而影响结果,可以使用ISO-8859-1进行处理。在处理中文时,可以使用GBK或UTF-8,而不能使用ISO-8859-1,否则会出现乱码。因此模式二下同时涉及中文,可以使用两者结合的方式,例如下边的代码:
package test11;

public class TestStr {
	public static void main(String[] args) throws Exception {
		String str = "张三";
		String str1 = new String(str.getBytes("UTF-8"),"ISO-8859-1");
		String str2 = new String(str1.getBytes("ISO-8859-1"),"UTF-8");
		System.out.println(str2);
	}
}


注意:此处使用的是String类的构造方法传入编码方式进行的数据转换
发表评论
用户名: 匿名