新闻详情

日文中字乱码一二三区别?日文乱码一二三四五

小编:时间:2023-10-26 06:33:17   来源:火箭下载站整理

老铁们,大家好,相信还有很多朋友对于日文中字乱码一二三区别和日文乱码一二三四五的相关问题不太懂,没关系,今天就由我来为大家分享分享日文中字乱码一二三区别以及日文乱码一二三四五的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

1、乱码的现象和本质

网上冲浪、运行应用、查看文件时电脑显示器有时出现无法辨识的乱码,可能的原因是怎样的呢?

这需要从“编码”和“解码”的角度来理解。例如编辑一个文件,通过键盘等设备在显示器上输入字母、数字、标点符号及中文字符,文件保存时会将输入内容编码成二进制内码存储在电脑文件中。

在电脑显示器上显示文件时,首先将二进制内码读出,使用正确的解码规则进行解析才能正确显示对应的字母、数字、标点符号及中文字符等。

出现“乱码”的根本原因是数据存储或传输使用的编码规则,与显示数据时使用的解码规则不一致造成的。

例如使用UTF-8编码规则编辑和保存的文件,使用GBK编码规则读取文件内容,就可能出现中文乱码。

2、字符、字符集和字符编码

字符:字符是各种文字和符号的总称,可以有形,也可以无形。例如ASCII字符表中的可打印字符和控制字符、扩展ASCII表中的字符、汉字中的全角字母数字和符号、汉字、日文片假名等等符号都是字符。

字符集:为每个字符指定一个唯一的数字编码id,形成一张一一对应的编码id和字符的映射关系表,就是字符集。下面举例几种常用的字符集。

ASCII字符集:定义了128个字符,包括控制字符和英语系字符,定义了128个编码id,每个字符对应一个唯一的数字编码id。分别用十进制的0-127指向128个字符。

扩展ASCII字符集:定义了128个字符符号,表示表格符号、计算符号、希腊字母和特殊的拉丁符号等,定义了每个字符对应一个唯一的数字编码id,分别用十进制的128-255指向128个字符。

GBK字符集:为汉字处理而生,全称是汉字内码扩展规范。GBK字符集收录了2万多个字符符号。每个字符的编码id长度是不同的,英文字符使用一个字节编码id,兼容ASCII字符集编码;中文部分字符采用2个字节编码id。

其中ASCII字符部分,使用十进制的0-127对应128个字符。其他部分,编码空间为0x8140-0xFEFE,共计23940个码位,目前收录了21886个汉字和图形符号。

Unicode字符集:由于不同的国家或地区使用的字符集不一致,可能造成字符无法正常显示。国际化组织制定了Unicode字符集标准,它为全球每种语言中的每个字符都设定了统一并且唯一的二进制编码id,便于跨语言、跨平台的文本转换、处理。

Unicode的每个字符的编码id可以使用2个字节或4个字节,分别称为UCS-2和UCS-4。

UCS-2的编码空间为\u0000-\uFFFF,有65536个编码位,可以表示65536个不同的字符,可以涵盖世界上大部分的符号。

UCS-4的编码空间为\u00000000-\u7FFFFFFF,有2147483647个编码位,可以编码多达21亿以上的字符。其中UCS-4的\u00000000-\u0000FFFF与UCS-2的\u0000-\uFFFF完全相同,是兼容的。

目前基本都在使用UCS-2,即使用2个字节编码id(码位/码点/codepoint)指向对应字符。

字符编码:字符集中定义了字符和该字符的编码id。在程序中怎样使用这些字符,怎样存储和传输这些字符,就是字符编码问题。

字符编码表示存储或传输该字符使用的编码。对于ASCII和GBK字符,直接使用字符对应的数字编码id做为字符编码。

例如大写字母D的ASCII值为68(十进制),GBK兼容ASCII,所以大写字符D以GBK或ASCII存储或传输时都是使用68对应的二进制数字:01000100。

汉字“和”在GBK字符集中对应的数字编码id是47821,对应的二进制为:1011101011001101,GBK存储或传输字符“和“时,使用该二进制数据。

Unicode字符集定义的字符与该符号的数字编码id。该字符在存储或传输时使用什么样的编码呢?Unicode字符集使用UTF-8\UTF-16\UTF-32等编码方式为字符进行编码,该编码值做为该字符存储或传输的值来使用。

所以,我们常说的字符编码,是用来存储或传输字符时使用的二进制数字串,可能与字符在字符集中的的数字编码id/代码位/字位不同。

所以可以这样理解Unicode和UTF:

unicode是字符集,字符集为每个字符分配一个唯一的id,该id学名叫码位/码点/codepoint;

utf-8是编码规则,将该id转换为字节序列,可以用编码/解码,加密/解密来直观理解,是存储、传输、处理该字符使用的编码规则。

3、Unicode和GBK字符集的直观认识

下表是2个字节表示的unicode字符集的全貌,可以定义65536个字符,详细的分类不在该表中体现。

下表摘录了unicode字符集中的部分符号和对应unicode编码id/码位/码点,便于对unicode字符集中的字符和字符id有个直观感觉。

\u0030-\u005F摘录了部分数字、符号和大写字母。

\u00F0-\u00FF,摘录了部分拉丁文字符

\uFF20-\uFF2F,摘录了该区域的全角大写字母和符号。

\u4EA0-\u4FFF,摘录了该区域内的部分汉字。

\u74D0-\u74DF,摘录了该区域的汉字

可见,任何一个符号,在unicode字符集中都有唯一对应的编码id,该编码id在unicode字符集中以十六进制表示,例如字符”A”的unicode编码id是\uFF21,汉字“京”的unicode编码id\u4EAC,都是采用4位16进制数表示。

下表概述了GBK字符集的概貌,主要分为单字节编码部分和双字节编码部分,单字节部分兼容ASCII标准,双字节部分用于描述汉字字符。

下表摘录了GBK字符集中的部分符号和对应GBK编码/码位/编码id,便于直观了解GBK字符集。

0030-005F摘录了部分数字、符号和大写字母及其编码id。

A1C0-A1CF摘录了该范围内的拉丁字符及编码id。

A3C0-A3CF摘录了该区域的全角大写字母和符号的符号及编码id。

A8B0-A8BF摘录了该区域的拼音字符及编码id

B9C0-CEBF,摘录了该区域内的部分汉字字符和对应编码id。

可见,任何一个符号,在GBK字符集中都有唯一对应的编码id,该编码id在GBK字符集中以十六进制表示,例如字符”A”的GBK编码id是0x0041,汉字“京”的GBK编码id是0xBEA9,都是采用4位16进制数表示。

4、UTF-8和GBK的编码解码规则

UTF-8编码规则:首先查找字符在字符集中的编码id,确定使用几个字节编码,再套用模板形成该字符的编码,具体规则见下表,UTF-8可以使用1-4个字节编码unicode字符,考虑到中文环境下基本遇不到4个字节的情况,下表只考虑了1-3个字节编码的问题。

UTF-8的解码规则,根据utf-8编码形成的过程,可以知道:

A:对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

B:对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

所以,对utf-8解码时,读到的字节的第一个bit为0时,直接使用后面的比特位做为id到unicode字符表中去查,查到的符号就是要显示出来的符号。

如果读到的字节的前n位(n>1)为1,第n+1位为0,则继续读后面的n-1个字节,将第一个字节的n+1个bit以后的比特位,和后面n-1个字节各个字节的后六位串起来,就形成了该字符的unicode的字符id,根据该id可以在unicode字符集中查到对应的字符显示出来。对应多个字节的字符的编码,除前导字节外,其他的字节以10开头,不符合该规则时解码报错。

GBK编码规则:直接使用GBK字符集中的字符id的二进制数进行存储和传输。

GBK解码规则:遇到知:取一个字节,如果该字节的首位为0,代表该字节表示一个ASCII字符,则用该编码id到Unicode字符集中去查找对应的字符并显示出来。

如果读取字节的第一位是1,则连续读两个字节,用两个字节形成的十六进制编码到GBK字符集中查找并显示对应字符。

下面举例说明UNICODE的utf-8编码及GBK的编码和解码过程,见下表。

下图描述了使用UltraEdit编辑、保存、显示一个UTF-8格式文件的字符形式和十六进制形式,其中十六进制形式是该文件存储传输实际使用的二进制编码的十六进制形式。

下图描述了使用UltraEdit编辑、保存、显示一个GBK格式文件的字符形式和十六进制形式,其中十六进制形式是该文件存储传输实际使用的二进制编码的十六进制形式。

5、编码解码不一致造成的乱码分析

用GBK解析UTF-8数据:

下面的二进制编码符合UTF-8,对应的unicode字符编码为\u0043\u4e2d\u0064

字符序列为C中d

0100001111100100101110001010110101100100

如果用GBK规则读取和解析该二进制串,则对应为\u0043\u4b8\uad64

\u0043是单字节ASCII字符,在GBK字符集中对应C

\u4b85,在GBK字符集中,高字节从81开始,故查不到该编码对应的字符

\uad64,在GBK字符集中是“璬”

用UTF-8解析GBK数据:

下面的二进制序列符合GBK编码规则,六进制为43D6D064,对应字符为“C中d”

01000011110101101101000001100100

使用utf-8解析上述二进制序列:

01000011解释为ASCII字符,单字节编码,可以解析出为C

11010110说明双字节表示一个字符,需要继续读下一个字节,下一个字节应该从10开始,但却是11,故发生错误,估计会出现乱码

01100100解释为ASCII字符,单字节编码,如果不受前面错误影响,估计可以解析出为d

在cmd下实际验证一下:见下图。

编辑utf.txt文件,保存形式为utf-8格式

C>chcp65001

设置当前代码页为65001,65001就是utf-8编码格式.

此时CMD命令窗口使用unicode的utf-8编码方式

通过验证此时能正确显示文件的字符信息。

D>chcp936

设置当前代码页为936,

此时CMD为使用GBK字符编码集。

此时显示utf-8格式的文件,显示为乱码

编辑gbk.txt文件,保存形式为gbk格式

D>chcp936

设置当前代码页为936,

此时CMD为使用GBK字符编码集。

此时显示gbk.txt的GBK格式的文件,显示正常

C>chcp65001

设置当前代码页为65001,65001就是utf-8编码格式.

此时CMD命令窗口使用unicode的utf-8编码方式

此时显示gbk.txt的GBK格式的文件,出现乱码,位置合适的首字符为0的单字节字符可以正常显示

6、cmd控制台的字符集

默认情况下,命令行窗口中使用的字符集编码是中文字符集或者西文字符集,取决于安装设置操作系统时的选择。

命令行窗口中使用chcp可以显示或设置CMD主控台使用的字符集。

chcp命令,英文全称是:changecodepage,用途是显示或设置活动代码页编号。

在cmd主控台的“属性“tab页,可以显示当前使用的字符集。如下图,表示当前命令提示符下使用的代码页为936,字符集是简体中文GBK。改变代码页/字符集可以使用上面介绍的chcp命令。但需要注意:chcp改变字符集及编码方式是临时性的,系统重启后会恢复到初始状态。

代码页是字符集编码的别名,cmd窗口的字符集编码为936,是ANSI/OEM-简体中文GBK的编码。cmd窗口使用GBK进行信息的编码和解码,如果cmd收到到的信息不是GBK编码的,使用该解码规则得到的结果就有可能是乱码,当然如果全是ASCII字符信息,由于编码的兼容,能正确显示。

下面是在cmd可以设置的代码页信息(字符集编码信息)。

7、CMD下测试字符集的显示效果

如下图,使用UtraEdit编辑存储两个文件:1.txt和2.txt

文件1.txt使用“936(ANSI/OEM-简体中文GBK)”字符集编码存储文件内容,文件内容包括ASCII字符和汉字字符。

文件2.txt使用“65001(UTF-8)”字符集编码存储文件内容,文件内容包括ASCII字符和汉字字符。

在CMD窗口分别显示这两个字符集编码不同的文件,看看实际显示效果。

如下图所示,当文件使用的字符集和CMD的字符集一致时,文件可以在CMD中正常显示。

cmd使用936代码页即简体中文GBK字符集编码时,使用简体中文GBK编码的文件1.txt可以正常显示;使用65001即UTF-8字符集编码的文件2.txt中的汉字为乱码。

cmd使用65001代码页即UTF-8字符集编码时,使用936简体中文GBK编码的文件1.txt中的汉字显示为乱码;使用65001即UTF-8字符集编码的文件2.txt显示正常。

测试表明,如果文件内容只包含ASCII字符信息,不用管该文件的编码和解码使用的字符集,都能正确处理文件内容。不同字符集编码处理ASCII字符的规则是一致的。

8、Tomcat启停脚本的日志信息

以中文windows10安装tomcat9.0为例,见下图,在不改变CMD及TOMCAT各种参数的情况下,以管理员身份进入cmd窗口,切换到tomcat安装主目录下的bin目录中。

bin目录中startup.bat和shutdown.bat是最大众化的启动和关闭tomcat的命令脚本。

执行shutdown.bat脚本,试图关闭tomcat服务器,在本cmd窗口出现中文乱码。

执行startup.bat脚本,试图启动tomcat服务器,系统打开一个新的启动窗口,新的启动窗口的启动日志中的中文仍为乱码。

startup.bat和shutdown.bat两个脚本,实际上都是调用catalina.bat脚本实现tomcat的启动和关闭的。

C>catalina.batstop相当于shutdown.bat脚本

C>catalina.batstart相当于startup.bat脚本

C>catalina.batrun相当于startup.bat脚本,但服务器启动的日志信息不打开新的窗口

从下图可以看出,默认设置执行上述脚本命令,汉字显示仍为乱码

9、tomcat日志正确显示方法一

修改tomcat日志的编码方式,让其符合CMD的编码解码方式,达到tomcat编码日志和window的cmd解码日志的一致。

中文windows10默认cmd的代码页(字符集)为936简体中文GBK。经查,tomcat的日志的字符集编码为UTF-8。

tomcat安装目录下的conf目录下有logging.properties文件,该文件定义了tomcat的日志处理方式,tomcat启动时会读该文件内容。

修改tomcat的logging.properties文件的控制台输出编码为GBK,即可实现中文日志的正常输出。

logging.properties的部分内容见下图,cmd主控台输出的日志的编码格式为UTF-8,如果cmd主控台的字符集为936简体中文GBK,其中输出的中文日志自然无法正确显示。

修改logging.properties中java.util.logging.ConsoleHandler.encoding为GBK,经测试C>shutdown.bat及C>catalina.batrun可以正常输出中文日志信息。见下图。

如果使用C>startup.bat启动tomcat,通过下图可以看到,新打开的窗口也可以正常显示中文日志信息。

10、tomcat日志正确显示方法二

永久修改windows10的cmd的字符集和编码方式,让cmd使用目前多数程序都使用的unicode字符集的utf-8方式,一劳永逸。

电脑进入cmd命令行窗口时自动执行chcp65001,将cmd命令窗口使用的字符集置为unicode字符集的utf-8编码模式,这样在cmd命令窗口中执行的操作都使用utf-8编码,和目前新兴的软件的字符编码方式一致,确保多数软件的cmd输出都是正确的。

此时,C>shutdown.bat

C>catalina.batrun

都能正常运行来启停tomcat。

但如果使用传统的C>startup.bat,启动时打开一个新的窗口tomcat,该窗口中还的代码页还是936,仍然是汉字乱码。

需要在HKEY_CURRENT_USER的Console下新建项Tomcat.这是在cmd中运行C>startup.bat启动tomcat服务器时新打开的窗口。

为Tomcat设置参数,其中CodePage设置为65001即UTF-8,即打开的tomcat新窗口使用UTF-8编码。其他的各项是设置该Console窗口的大小字体缓冲区等参数

将注册表中的字符集信息修改后,在CMD命令窗口执行tomcat的启停操作,汉字能正常显示,见下图。

11、tomcat日志正确显示方法三

既然是在windows环境运行tomcat,可以不使用命令行管理tomcat,直接在图形界面中启停tomcat,相关日志记录在日志文件中,利用编辑工具直接查看日志文件。编辑工具可以识别日志文件的编码方式,使用合适的界面规则正确显示日志文件。

下图为tomcat提供的图形界面。

下面是日志文件所在的位置,以及使用普通编辑文件查看日志文件的示例。

关于日文中字乱码一二三区别到此分享完毕,希望能帮助到您。

精彩推荐