资源描述:
《Java如何做字符串编码转换》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Java正确的做字符串编码转换字符串的内部表示?字符串在java中统一用unicode表示(即utf-16LE), 对于 Strings="你好哦!";如果源码文件是GBK编码,操作系统(windows)默认的环境编码为GBK,那么编译时, JVM将 按照GBK编码将字节数组解析成字符,然后将字符转换为unicode格式的字节数组,作为内部存储。当打印这个字符串时,JVM根据操作系统本地的语言环境,将unicode转换为GBK,然后操作系统将GBK格式的内容显示出来。 当源码文件是UTF-8,我们需要通知编
2、译器源码的格式,javac-encodingutf-8...,编译时,JVM按照utf-8解析成字符,然后转换为unicode格式的字节数组,那么不论源码文件是什么格式,同样的字符串,最后得到的unicode字节数组是完全一致的,显示的时候,也是转成GBK来显示(跟OS环境有关) 乱码如何产生?本质上都是由于字符串原本的编码格式与读取时解析用的编码格式不一致导致的。例如:Strings="你好哦!";System.out.println(newString(s.getBytes(),"UTF-8"));//
3、错误,因为getBytes()默认使用GBK编码,而解析时使用UTF-8编码,肯定出错。其中getBytes()是将unicode转换为操作系统默认的格式的字节数组,即"你好哦"的GBK格式,newString(bytes,Charset)中的charset是指定读取bytes的方式,这里指定为UTF-8,即把bytes的内容当做UTF-8格式对待。如下两种方式都会有正确的结果,因为他们的源内容编码和解析用的编码是一致的。System.out.println(newString(s.getBytes(),"
4、GBK"));System.out.println(newString(s.getBytes("UTF-8"),"UTF-8")); 那么,如何利用getBytes和newString()来进行编码转换呢? 网上流传着一种错误的方法:GBK-->UTF-8: newString(s.getBytes("GBK"),"UTF-8); ,这种方式是完全错误的,因为getBytes的编码与 UTF-8不一致,肯定是乱码。但是为什么在tomcat下,使用newString(s.getBytes("iso-8859
5、-1"),"GBK")却可以用呢?答案是:tomcat默认使用iso-8859-1编码,也就是说,如果原本字符串是GBK的,tomcat传输过程中,将GBK转成iso-8859-1了,默认情况下,使用iso-8859-1读取中文肯定是有问题的,那么我们需要将iso-8859-1再转成GBK,而iso-8859-1是单字节编码的,即他认为一个字节是一个字符,那么这种转换不会对原来的字节数组做任何改变,因为字节数组本来就是由单个字节组成的,如果之前用GBK编码,那么转成iso-8859-1后编码内容完全没变,则
6、s.getBytes("iso-8859-1") 实际上还是原来GBK的编码内容则 newString(s.getBytes("iso-8859-1"),"GBK") 就可以正确解码了。所以说这是一种巧合。 如何正确的将GBK转UTF-8?(实际上是unicode转UTF-8)StringgbkStr="你好哦!";//源码文件是GBK格式,或者这个字符串是从GBK文件中读取出来的,转换为string变成unicode格式//利用getBytes将unicode字符串转成UTF-8格式的字节数组byte[]
7、utf8Bytes=gbkStr.getBytes("UTF-8"); //然后用utf-8对这个字节数组解码成新的字符串Stringutf8Str=newString(utf8Bytes,"UTF-8");简化后就是:unicodeToUtf8(Strings){returnnewString(s.getBytes("utf-8"),"utf-8");}UTF-8转GBK原理也是一样returnnewString(s.getBytes("GBK"),"GBK"); 其实核心工作都由 getBytes(c
8、harset)做了。getBytes的JDK描述:EncodesthisStringintoasequenceofbytesusingthenamedcharset,storingtheresultintoanewbytearray. 另外对于读写文件,OutputStreamWriterw1=newOutputStreamWriter(newFileOutputStream("D:\file1.txt"),"