程序字符集知识

发布时间 2023-11-16 11:44:31作者: 断舍离-重学JAVA之路

一、基础知识:

为什么采用中文编程不行?

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哈哈~ ~