如何推断乱码是从何种编码转换到何种编码导致的乱码?

编程入门 行业动态 更新时间:2024-10-25 20:28:34

如何推断<a href=https://www.elefans.com/category/jswz/34/1768993.html style=乱码是从何种编码转换到何种编码导致的乱码?"/>

如何推断乱码是从何种编码转换到何种编码导致的乱码?

 只能推断一层哦。如果已经乱了,再转换就更乱了,就无法再推断了。呵呵。

 

 
  1. import java.io.UnsupportedEncodingException; 
  2.  
  3. public class TestEncode { 
  4.  
  5.     public static void main(String[] args) { 
  6.         String utf_8_gbk = ""; 
  7.         String gbk_utf_8 = ""; 
  8.          
  9.         String utf_8_gb2312 = ""; 
  10.         String gb2312_utf_8 = ""; 
  11.          
  12.         String utf_8_iso8859_1 = ""; 
  13.         String iso8859_1_utf_8 = ""; 
  14.          
  15.         String gbk_iso8859_1 = ""; 
  16.         String iso8859_1_gbk = ""; 
  17.          
  18.         String iso8859_1_gb2312 = ""; 
  19.         String gb2312_iso8859_1 = ""; 
  20.          
  21.         // UTF-8 GBK ISO8859-1 GB2312 
  22.         try { 
  23.             utf_8_gbk = new String("金永华2011".getBytes("UTF-8"), "GBK"); 
  24.             gbk_utf_8 = new String("金永华2011".getBytes("GBK"), "UTF-8"); 
  25.              
  26.             utf_8_gb2312 = new String("金永华2011".getBytes("UTF-8"), "GB2312"); 
  27.             gb2312_utf_8 = new String("金永华2011".getBytes("GB2312"), "UTF-8"); 
  28.              
  29.             utf_8_iso8859_1 = new String("金永华2011".getBytes("UTF-8"), "ISO8859-1"); 
  30.             iso8859_1_utf_8 = new String("金永华2011".getBytes("ISO8859-1"), "UTF-8"); 
  31.              
  32.             gbk_iso8859_1 = new String("金永华2011".getBytes("GBK"), "ISO8859-1"); 
  33.             iso8859_1_gbk = new String("金永华2011".getBytes("ISO8859-1"), "GBK"); 
  34.              
  35.             iso8859_1_gb2312 = new String("金永华2011".getBytes("ISO8859-1"), "GB2312"); 
  36.             gb2312_iso8859_1 = new String("金永华2011".getBytes("GB2312"), "ISO8859-1"); 
  37.         } catch (UnsupportedEncodingException e) { 
  38.             e.printStackTrace(); 
  39.         } 
  40.          
  41.         System.out.println("utf_8_gbk: " + utf_8_gbk); 
  42.         System.out.println("gbk_utf_8: " + gbk_utf_8); 
  43.          
  44.         System.out.println("utf_8_gb2312: " + utf_8_gb2312); 
  45.         System.out.println("gb2312_utf_8: " + gb2312_utf_8); 
  46.          
  47.         System.out.println("utf_8_iso8859_1: " + utf_8_iso8859_1); 
  48.         System.out.println("iso8859_1_utf_8: " + iso8859_1_utf_8); 
  49.          
  50.         System.out.println("gbk_iso8859_1: " + gbk_iso8859_1); 
  51.         System.out.println("iso8859_1_gbk: " + iso8859_1_gbk); 
  52.          
  53.         System.out.println("iso8859_1_gb2312: " + iso8859_1_gb2312); 
  54.         System.out.println("gb2312_iso8859_1: " + gb2312_iso8859_1); 
  55.     } 
  56.  

在windows xp下打印:

 

utf_8_gbk: 閲戞案鍗�011

gbk_utf_8: ������2011

utf_8_gb2312: ��案��011

gb2312_utf_8: ������2011

utf_8_iso8859_1: 金永åŽ2011

iso8859_1_utf_8: ???2011

gbk_iso8859_1: ½ðÓÀ»ª2011

iso8859_1_gbk: ???2011

iso8859_1_gb2312: ???2011

gb2312_iso8859_1: ½ðÓÀ»ª2011

 

分析的方法是,对照中文和数字的乱码情形是上面那种,就能推断出乱码是经由哪种编码转换所形成的。以上方法对于推断乱码的形成,有一点作用。但,有时也使不上力,因为:转换后的编码很有可能是不可逆的(转换过程中可能存在信息丢失,iso8859-1例外)。

所以,解决乱码问题时,一定要找到原始的字节数组(字符串在内存中的真实本质内容),然后,再结合表象,分析出它的编码方式。或者,更准确的方式是拿非乱码的文本的getBytes("xxx编码");得到的数组 与 上面得到的原始的字节数组去比较,获得确切的编码方式。然后,可以做如下编码转换:

String str = new String(字符串原始字符数组, 得到该原始字符数组的确切的编码方式);

这样,str就变成非乱码了。在内存中会转化为正确的unicode码。乱码解决的大致思路就是这样的。

再啰嗦一下,编码转换很有可能会导致信息丢失,导致无法反向转回来。譬如,UTF-8编码的字符串:“金永华2011”,转换成GBK编码,然后,反向转回来(从GBK转回UTF-8),此时,已经无法得到最初的“金永华2011”的UTF-8的编码原始byte数组。看代码:

 

 
  1. try { 
  2.             utf_8_gbk = new String("金永华2011".getBytes("UTF-8"), "GBK"); 
  3.             target = new String(utf_8_gbk.getBytes("GBK"), "UTF-8"); 
  4.         } catch (UnsupportedEncodingException e) { 
  5.             e.printStackTrace(); 
  6.         } 
  7.          
  8.         System.out.println("utf_8_gbk: " + utf_8_gbk); 
  9.         System.out.println("target: " + target); 

执行结果是:

utf_8_gbk: 閲戞案鍗�011

target: 金永�?011

可见,只是还原出了部分汉字,还是有部分汉字存在乱码。

转载于:

更多推荐

如何推断乱码是从何种编码转换到何种编码导致的乱码?

本文发布于:2024-03-10 10:34:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1727737.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:乱码   是从   推断

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!