java出现乱码的原因,java运行出来乱码
java在字符串中统一用Unicode表示。
对于任何字符串:String string=" test 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=" test string
system . out . println(new String(s . getbytes(), UTF-8 );
//错误,因为getBytes()默认使用GBK编码,但解析时使用UTF-8编码。一定是出错了。GetBytes()是将Unicode转换成操作系统默认格式的字节数组,即“测试字符串”的GBK格式,new String (bytes,charset)中的Charset是指定的读取字节的方式,这里指定为UTF-8,即字节的内容读取为UTF-8。
以下两种方式得到的结果都是正确的,因为它们的源内容代码和解析代码是一样的。
system . out . println(new String(s . getbytes(), GBK ));
System.out.println(新字符串(s.getBytes(UTF-8 ), UTF-8 ));如何正确的将GBK转UTF-8 ? (实际上是unicode转UTF-8)
//通过getBytes将unicode字符串转换成UTF-8格式的字节数组,然后通过utf-8将这个字节数组解码成新的字符串
新字符串(s.getBytes(utf-8 ), utf-8 );UTF-8对GBK的原理是一样的
新字符串(s.getBytes(GBK ), GBK );实际上,核心工作是由getBytes(charset)完成的。JDK对getBytes的描述:使用命名字符集将这个字符串编码成一个字节序列,将结果写入一个新的字节数组。
output streamwriter w1=new output streamwriter(new file output stream( D:\ \ file 1 . txt ), UTF-8 );
输入StreamReader (Stream,Charset)更多相关文章教程推荐:java语言入门以上是如何避免java程序乱码的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。