一、基础知识:
为什么采用中文编程不行?
https://mp.weixin.qq.com/s/v22aUQ-9ietJYdz0wMNUUQ
字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8
https://zhuanlan.zhihu.com/p/38333902
主要(分清)认识两个概念: 字符集、字符编码(规则) :
字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。
常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
举例: 1、ASCII字符集就是128个字符图像, ASCII编码就是 0xxxxxxx 的数字编码;
2、同样 GB2312字符集,和 GB2312字符编码规则, 这是两个东西,一个是图像,一个是编码,虽然名字都叫GB2312或GBK.
3、Unicode字符集,对应的编码规则就比较多: UTF-16, UTF-8, UTF-16le、 UTF-16be、UT等等。
支持原创: https://www.cnblogs.com/java2java/p/17835886.html
二、JAVA内部字符集流转
三、扩展:
刨根究底字符编码之七——ANSI编码与代码页
https://zhuanlan.zhihu.com/p/27136737 特殊: windows自创的ANSI字符编码规则,ANSI配合 windows系统的语言选项(CodePage)使用。
Linux 如何设置语言和字符集:
1、locale 命令
2、修改: /etc/locale.conf 系统配置文件等
四、实验:
此时未指定javac 编码方式, 默认使用系统语言对应的gbk, 结果报错gbk字符集编码里没有那个编码号,因为记事本保存的是UTF-8格式。
指定 -encoding utf8 后, javac 编码成功, java运行成功,此时理解其中过程: 1、 javac 将 utf8编码 转换成 utf-16编码, java 运行时将 utf-16 转换为系统对应的字符集格式gbk 显示在界面上(此时就没有utf8什么事儿了)。
ps: 另一种解决方法是: 不指定 -encoding utf8 ,而是将源代码另存为 ANSI(GBK)格式。
linux测试:
将GBK源码编译的class复制到linux, 使用java 运行,结果是都可以运行
因为class里已经是utf-16的unicode编码值了,java运行时可以根据算法自动转换成任意的输出(屏幕支持的)字符集。
由于目前console支持的字符集是utf8, 所以 输出指定file.encoding=gbk时,显示为乱码。
此时把console的字符集设置成gbk,那么gbk就显示正常了。但是输出指定file.encoding=utf8就显示乱码。只是显示的时候字符集支持的问题。
也就是说它是(输出指定file.encoding=gbk与console设定的字符集不一致)的问题,不是 jvm的问题。
扩展知识2:
windows cmd console 窗口默认是 gbk, 但是 springboot 设置的打印日志字符编码为 UTF8 该怎么办?
此时:可设置windows bat文件中增加命令 chcp 65001 ,即将当前页面支持的字符集设置为utf8. 然后显示即可正常。
https://www.cnblogs.com/java2java/p/17835886.html
如果有帮到你,点个赞吧 O(∩_∩)O哈哈~ ~
标签:字符,UTF,编码,字符集,知识,程序,gbk,utf8 From: https://www.cnblogs.com/java2java/p/17835886.html