从内部分析Java控制台乱码
2021/10/28 17:09:49
本文主要是介绍从内部分析Java控制台乱码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
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控制台乱码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)