String str = new String("中".getBytes(),"gb2312");
String temp = new String(str.getBytes(),"utf-8");
String an = new String(temp.getBytes(),"gb2312");
System.out.println(an);
这里为什么输出的an会是乱码么????请哪位大侠帮忙解释下。。谢谢
String temp = new String(str.getBytes(),"utf-8");
String an = new String(temp.getBytes(),"gb2312");
System.out.println(an);
这里为什么输出的an会是乱码么????请哪位大侠帮忙解释下。。谢谢
解决方案 »
- swing中JComboBox怎样去掉border?
- sql中datetime数据类型,java里怎么用字符串转成sql要的哪个类型?
- 如何制作下拉菜单快捷键
- java中图片的大小
- applet中的监听器
- 请教一个Applet问题,平时接触的少不会做这方面的东东
- 有人懂crystal clear的模版吗?
- 请问有没有谁为菜单项设了快捷键不好使的item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,Event.CTRL_MASK));请进来指教。
- java中有没有和javascript中escape()功能一样的方法?
- ★高手,rmi的初级问题
- escapeHTML
- 一个关于线程的小程序,请大家帮我分析下
因此,我们在对字符串进行解码的时候,尽量指定编码方式。
好,现在我现在假定本地编码是gb2312,这个时候temp肯定是乱码。一个使用gb2312解码字节数组,用utf8编码的话,肯定是不能解析成正确的字符串的。
如果,temp是乱码,也就是出现几个?,使用本地编码进行解码的时候,是能够被正常解码的,因为本地编码和gb2312对?号的编码的字节一致,因此编码后的an依然是?
这样 测试下
String str = new String("中".getBytes("gb2312"),"gb2312");
String temp = new String(str.getBytes(),"utf-8");
String an = new String(temp.getBytes());
System.out.println(an);
String str = new String("中".getBytes("gb2312"),"gb2312");
System.out.println(str);
试试,看是否还是乱码
String temp = new String(str.getBytes("utf-8"),"utf-8");
String an = new String(temp.getBytes("ISO-8859-1"),"gb2312");
System.out.println(an);
挨个试试吧。getBytes()里要放需要转换的字符串的编码格式
1:/ java 中将字节数组按照一定的编码规则生成字符的过程称为编码
2:/ 将字符按照一定的编码规则生成字节数组的过程成为解码
3:/ 编码规则--关于这点应该有很多话要说。但要解决这个问题只要知道:它规定了一个字节数组与一个特定的字符相对应
4:/ java 采用的字符时 UNICODE 字符。关于这个也是跟很长的话题。解决这个问题只要知道:UNCODE 包括的目前世界上的所有文字符号。(有可能不是全部呵呵~~没有考证啊~)
String str = new String(/*flag-1*/"中".getBytes()/*这里的含义是:将"中"这个字符以默认的编码方式解码(默认的解码方式与系统有关。简体中文的 WindowXP 好像是 GBK 其余 gb2312 有一定的兼容性)生成字节数组*/
,"gb2312"); // 将 flag-1 处的操作所生成的字节数组按 gb2312 编码. 解码与编码方式一致没有乱码问题。
String temp = new String(str.getBytes(),/*这里的含义是:将"中"这个字符以默认的编码方式解码. 注意这里用到的编码方式是 GBK. GBK 规定 [-42, -48] 这个字节数组与 "中"相对应。*/
"utf-8"); // 这里使用 utf-8 将 [-42, -48] 进行编码。但是 utf-8 规定 [-28, -72, -83] 这个字节数组与 "中" 字相对应。--所以到这里已经乱码了。
String an = new String(temp.getBytes(),"gb2312"); //这里不知道 LZ 是不是希望实现将乱码在转会正常字符。这不可能。应为 temp.getBytes() 不能再次生成 [-42, -48] 这个字节数组
System.out.println(an);
其实,在JAVA中使用字符串的时候,是根本不需要考虑编码的问题,只有涉及到字符串到字节数组转换的时候,比如存储到文本中,或从文本中读取,我们才需要考虑编码的问题,对于同一字符串,用不同的编码进行编码,得到的字节数组是不一致的.至于虚拟机怎么处理的,跟我们使用String是没有关系的.
在Java中,一个字符始终是以两个字节存储,在转换为字节码的时候,每个字符在字节码里面占用两个字节.
假设你当前编码是GB2312,当执行到需要显示字符串的时候,虚拟机做了这么些事情.第一步,拿到字节码中存储的字节数组;第二步,使用UNICODE编码把字节数组解码成对应的字符串,第三步,显示字符串.