java在字符串中统一用Unicode示意。
关于恣意一个字符串:String string = “测试字符串”;
假如源文件是GBK编码,操作系统默许环境编码也为GBK,那末编译的时候,JVM将依据GBK编码将字节数组剖析为字符,然后将字符转换为Unicode花样的字节数组,作为内部存储(字节数组→字符→Unicode字节数组)。
当打印这个字符串时,JVM依据操作系统当地的言语环境,将Unicode转换为GBK,然后操作系统将GBK花样的内容显现出来。
当源码文件是UTF-8, 我们须要关照编译器源码的花样,javac -encoding utf-8 …
, 编译时,JVM依据utf-8 剖析成字符,然后转换为unicode花样的字节数组, 那末不管源码文件是什么花样,一样的字符串,末了获得的unicode字节数组是完全一致的,显现的时候,也是转成GBK来显现(跟OS环境有关)
相干进修视频引荐:java进修视频
乱码是怎样发生的?
本质上都是由于字符串底本的编码花样与读取时剖析用的编码花样不一致致使的。
形成乱码的缘由就是由于运用了毛病的字符编码去解码字撙节,因而当我们在思索任何跟文本显现有关的题目时,请时候坚持苏醒:当前运用的字符编码是什么,只要如许,我们才准确剖析和处置惩罚乱码题目。
java代码中的乱码题目怎样处理呢?
比方:String s = “测试字符串”;
System.out.println( new String(s.getBytes(),"UTF-8")); //毛病,由于getBytes()默许运用GBK编码, 而剖析时运用UTF-8编码,一定失足。
个中getBytes()
是将Unicode转换为操作系统默许花样的字节数组,即“测试字符串”的GBK花样,new String (bytes, Charset) 中的charset 是指定读取byte的体式格局,这里指定为UTF-8,即把bytes的内容当作UTF-8来读取。
以下两种体式格局获得的效果都是准确的,由于它们的源内容编码和剖析用的编码是一致的。
System.out.println( new String(s.getBytes(),"GBK")); System.out.println( new String(s.getBytes("UTF-8"),"UTF-8"));
怎样准确的将GBK转UTF-8 ? (实际上是unicode转UTF-8)
//应用getBytes将unicode字符串转成UTF-8花样的字节数组,然后用utf-8 对这个字节数组解码成新的字符串 new String( s.getBytes("utf-8") , "utf-8");
UTF-8 转GBK道理也是一样
new String( s.getBytes("GBK") , "GBK");
实在中心事情都由getBytes(charset)做了。getBytes的JDK形貌:Encoding this String into a sequence of bytes using the named charset,storing the result into a new byte array.
OutputStreamWriter w1 = new OutputStreamWriter(new FileOutputStream("D:\\file1.txt"),"UTF-8"); InputStreamReader( stream, charset)
更多相干文章教程引荐:java言语入门
以上就是怎样防止java顺序中涌现乱码的细致内容,更多请关注ki4网别的相干文章!