经过前一个项目的实践,我发现java平台里其实所有编码的字符串都可以正常显示,代码例如下
String strDefalt = "";
String strDefaltEncode = "";
String strChangeEncode = "";
try {
strDefalt = "我的心不乱";
strDefaltEncode = new String("我的心不乱".getBytes(),"gbk");
strChangeEncode = new String("我的心不乱".getBytes("shift-jis"),"shift-jis");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Default charsetName="+Charset.defaultCharset().name());
System.out.println("strDefalt="+strDefalt);
System.out.println("strDefaltEncode="+strDefaltEncode);
System.out.println("strChangeEncode="+strChangeEncode);
运行结果为:
Default charsetName=GBK
strDefalt=我的心不乱
strDefaltEncode=我的心不乱
strChangeEncode=我的心不乱
第一个显示的charsetName是我想打出我自己的平台里java默认的编码类型。
从而推测出第二行所表示的也就是strDefalt的字符串的编码类型为gbk。
根据第二行的推测重新将汉字转码为gbk,从而确认平台的默认编码为gbk。
而第三行,是我通过字符串转码将汉字【我的心不乱】由gbk编码转换为【shift-jis】的编码。
如上所示,默认的gbk的编码和shift-jis编码的汉字都可以正常的显示出来的
证明的确在平台中不同编码的字符可以正确的显示出来。
既然不同的汉字都可以正常的显示出来,那么我们为什么有字符串乱码的情况呢。
那么我们来简单的列举下,一般都是什么情况下会出现乱码呢,据我目前的项目经历,我的答案是从数据库中取字符和在 web项目中request给我的字符,那么这2种情况,我可以归结为这不是我在程序中所定义的字符,这些字符都是我在外界取到的。众所周知,java的输入输出都是byte流的,而我们所取到的字符都是java平台自己将byte数据通过平台默认的编码形式将byte转换为String的。所以在这种情况下就会出现乱码。
知道了原理,那么解决问题也就很简单了,那就是在byte被转化为String之前指定它的编码形式就可以了。
但有些时候我们无法再平台转码之前指定编码形式,这种情况下也是有办法的。。呵呵,,看下如下代码。
String strDefalt = "";
String strDefaltEncode = "";
String strChangeEncode = "";
try {
strDefalt = "我的心不乱";
strDefaltEncode = new String("我的心不乱".getBytes(),"iso-8859-1");
String temp = new String(strDefaltEncode.getBytes("iso-8859-1"),"gbk");
System.out.println("temp="+temp);
strChangeEncode = new String(temp.getBytes("shift-jis"), "shift-jis");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Default charsetName="+Charset.defaultCharset().name());
System.out.println("strDefalt="+strDefalt);
System.out.println("strDefaltEncode="+strDefaltEncode);
System.out.println("strChangeEncode="+strChangeEncode);
显示结果如下
temp=我的心不乱
Default charsetName=GBK
strDefalt=我的心不乱
strDefaltEncode=??????????
strChangeEncode=我的心不乱
除了第四行显示为乱码外,其他的都正常的显示了
乱码的原因是我将gbk编码的String错误的转化为了iso-8859-1编码所以出乱码了。
第四行字符正常显示的一个原因为我将乱码的String(也就是第四行所显示的String)还原为原先的Byte(组装成String之前的),然后再用完好的Byte转化为默认编码形式的String(第一行所表示的String)。而最后一行就是将完好的String在转化为自己想要的shift-jis的编码的String了
其转换的原理为所谓的转码其实也就是不同的字符编码的字符集的映射顺序不同。
比如在a编码中1281可能对应的是【我】而在b编码中1281对应的是【%】所以这就出先字符的乱码现象,
而将数字转化成字符,则首先要获得目的编码数字,在映射成相应的字符。上面的字符为默认的gbk码的数字(byte)被错误的映射成了iso-8859-1字符,所以乱码了,要转换回来的话,首先要获得gbk的数字,所以将错误的iso-8859-1字符转换为iso-8859-1数字,然后再用这gbk的数字转换成gbk的字符,再用gbk的字符转化为shift-jis的字符。
分享到:
相关推荐
浅析Java设计模式【1】——观察者!
浅析Java设计模式【3】——代理.pdf
常规是对字符串求md5指纹. 在golang里我们也可以使用, 目前可以计算一个字符串的crc32, md5, sha1的指纹. md5 : 一种被广泛使用的密码散列函数,可以产bai生出一个128位(du16字节)的散列值(hash value),用于...
浅析Java引用类型和方法参数传递,浅析Java引用类型和方法参数传递
本篇文章是对PHP中字符串编码转换的实现代码进行了详细的分析介绍,需要的朋友参考下
三、replace:返回某字符串的所有匹配项均被替换之后得到的字符串。 复制代码 代码如下:‘This is a test’.replace(‘is’,’are’) 四、split:将字符串分割成序列 复制代码 代码如下:‘1+2+3+4+5’.split(‘+’) ...
最大的区别就是C风格的字符串是静态的,不可以动态变化,使用极为麻烦。而C++的std::string类型动态管理,非常方便。 C风格字符串和char数组是不一样的,看下面两种定义:char carr1 = {‘a’, ‘b’, ‘c’};char ...
浅析Java中的final关键字Java开发Java经验技巧共6页.pdf.zip
数据库连接池浅析Java开发Java经验技巧共5页.pdf.zip
java实现word文档到xml文档转换浅析
浅析Java swing组件窗体设计.pdf
浅析Java中的访问权限控制Java开发Java经验技巧共8页.pdf.zip
浅析Java智能卡的应用与开发.pdf
浅析Java企业开发.pdf
浅析JAVA代理模式.pdf
浅析JAVA多线程.pdf
浅析Java泛型的使用.pdf
浅析Java异常处理机制.pdf