ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

从内部分析Java控制台乱码

2021-10-28 17:02:01  阅读:207  来源: 互联网

标签:字符 Java javac 编码 GBK 乱码 文件 UNICODE 控制台


JAVA处理字符的原理。JAVA使用UNICODE来存储字符数据,处理字符时通常有三个步骤:

  • 按指定的字符编码形式,从源输入流中读取字符数据

  • 以UNICODE编码形式将字符数据存储在内存中

  • 按指定的字符编码形式,将字符数据编码并写入目的输出流中。

JAVA处理字符时总是经过了两次编码转换,一次是从指定编码转换为UNICODE编码,一次是从UNICODE编码转换为指定编码。

如果在读入时,用错误的形式解码字符,则内存存储的是错误的UNICODE字符。

简单来说,就是用错误的编码方式解码了从输入流读取的字符数据,或用错误的编码方式将字符写入输出流,则下一个字符数据的接收者就会解码出错,从而导致最终显示乱码。

javac编译Java文件时,javac不会知道你所要编译的文件是什么类型,所以它需要指定读取文件所用的编码类型。

默认javac使用平台默认的字符编码类型来解析Java文件。而平台缺省(默认)编码是由操作系统决定的,我们使用的中午的操作系统的话平台缺省编码通常为GBK,可以使用System.getProperty("file.encoding")查看。

所以,javac会使用GBK来解析Java文件。如果要改变javac所用的编码类型,就要加上-encoding参数,如javac -encoding utf-8 Test.java,所以提前配置好项目和编译器的编码十分重要。

编译后字符数据会以UNICODE格式存入字节码文件中。然后编译器会调用java命令来运行此字节码文件。因为字节码中的字符总是 UNICODE格式,所以java读取字节码文件并没有编码转换过程。虚拟机读取文件后,字符数据便以UNICODE格式存储在内存中了。

调用System.out.println来输出字符发生字符编码转换,System.out.println使用了PrintStream类来输出字符数据至控制台。PrintStream会使用平台缺省的编码方式来输出字符,由于缺省的还是GBK所以会以GBK的形式输出。

举个例子

有个以utf-8编码格式保存的txt文件,使用BufferedReader读取这个txt文件。

然后使用PrintStream将这个文件打印在控制台,如果再IDEA中,控制台设置的编码格式是GBK就会出现乱码,所以我们必须使用utf-8解码。这样就没有问题了。

像是这样 UTF-8 ->转码-> UNICODE ->解码-> UTF-8

标签:字符,Java,javac,编码,GBK,乱码,文件,UNICODE,控制台
来源: https://www.cnblogs.com/leejk/p/15476484.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有