打开数据文件中的乱码 (数据文件打开是乱码)

当我们处理文件或程序字符时,我们会不时遇到乱码,这些乱码非常混乱,大多数时候都是CV一定程度上,看看有没有类似情况的博文。如果是这样,就按照博文上的方式一步一步解决。如果找不到,很多人会直接emo了。其实乱码听起来很复杂,解决起来也不是很难。今天我们来谈谈如何解决字符的编码和乱码。

什么是编码

编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的编码。将文本、数字或其他对象编成数字,或将信息和数据转换为规定的电脉冲信号。编码广泛应用于电子计算机、电视、遥控和通信。编码是信息从一种形式或格式转换为另一种形式的过程。解码是编码的逆过程。

编码分类

在日常开发中,编码格式很多,比如GBK、UTF-8、ASCII等等,很多人不知道这些编码格式之间有什么区别。他们只知道,如果编码格式与解码格式相同,则不会出现乱码问题。事实上,编码在计算机软件领域分为两类,一类是Unicode编码,另一种是非Unicode编码。

非Unicode编码

常见的非Unicode编码有,ASCII、GBK、GB18030、ISO8859-1、windows-1252 等;

ASCII

众所周知,世界上第一台计算机诞生于美国,当时的作者并没有想那么多,只考虑美国的需求(美国大约使用128个字符),所以当时规定了128个字符的二进制方法,即一套标准,即ASCII,全称American Standard Code for Information Interchange,译成美国信息交换标准代码。

计算机存储的最小单位是byte,即8位,128个字符可以用7位表示,在ASCII最高位为0,另外7位可以用0~127来表示字符,其中ASCII编码中规定了每个数字代表0~127的含义,基本上可以覆盖键盘上的所有字符。

需要注意的是,在ASCII有少数特殊的不打印字符,常用的不打印字符有

ASCII代码对美国来说已经足够了,但世界上有这么多国家,字符和语言是不同的。因此,各国各计算机制造商发明了各种编码方法来表示自己的字符,为了保持与ASCII码的兼容性一般设置为1。也就是说,当最高位为0时,表示标准ASCII代码是各国扩展其字符的代码。也就是说,当最高位为0时,表示标准ASCII代码是每个国家在第一时间扩展其字符的代码。在这些扩展编码中,在西欧国家很流行ISO 8859-1和Windows-1252,在中国是GB2312、GBK、GB18030,等会逐一介绍这些编码的区别。

ISO 8859-1和Windows-1252

ISO 8859-1又称Latin-1.它用字节表示字符,包括0~127和ASCII同样,128~255规定了不同的含义。在128~255中,128~159表示一些控制字符,160~255表示一些西欧字符,在中国不常用,所以不会一一介绍。

ISO 虽然859-1号称是西欧国家的统一标准,但它甚至是欧元(??)没有这个符号,因为欧元的符号相对较晚,而且ISO 8859-1标准较早。因此,在实践中应用更广泛Windows-1252 编码,这个编码和ISO 8859-1基本相同,区别只在于干数128~159。HTML5甚至明确规定,文件声明的话ISO 8859-1编码也应视为Windows-1252编码。为什么要这样?因为大多数人电脑不知道ISO 8859-1和Windows-当他说1252的区别时,ISO 8859-1,其实他指的是Windows-1252,所以标准只是如此强制性。Windows-使用其中一些数字表示可打印字符

GB2312、GBK、GB18030

我相信国内开发者对这三种编码格式并不陌生。这三种是中文字符显示的编码格式。这三种之间有什么区别和联系?

GB2312

在美国和西欧使用一个字节就足够了,但中文显然还不够。第一个中文标准是GB2312。GB2312标准主要针对简体中文常见字符,包括约700个汉字、一些罕用词和繁体字。

GB2312用两个字节固定表示汉字。在这两个字节中,最高位为1。如果是0,则认为是ASCII字符。在这两个字节中,高字节范围为0xA1~0xF7.低字节范围为0xA1~0xFE。

GBK

GBK建立在GB在2312的基础上,向下兼容GB也就是说,2312,GB2312编码的字符和二进制表示 GBK编码完全一样。GBK共增加了1.4万多个汉字,其中包括繁体字在内的汉字约2.1万个。

GBK体内固定的两个字节表示,高字节范围为0x81~0xFE,低字节范围为0x40~0x7F和Ox80~0xFE。

需要注意的是,低字节是从Ox从40(即64)开始,也就是说,低字节的最高水平可能是0。你怎么知道它是汉字的一部分还是一个?ASCII字符呢?其实很简单,因为汉字是用固定字节表示的.在分析二进制流时,如果第一个字节的最高位为1,则读取下一个字节并将其分析为汉字,而不考虑其最高位置。分析后,跳到第三个字节继续分析。

GB18030

GB18030向下兼容GBK,中日韩统一字符增加5.5万多个字符,共7.6万多个字符。

两个字节不能再表达了GB18030中的所有字符,GB18030使用变长编码,有的是两个字节,有的是四个字节。在字节编码中,字节表示范围和GBK一样。在四字节编码中,第一个字节值为0x81~0xFE,第二个字节的值为0x30~0x第三个字节值为0x81~0xFE,第四字节值为0x30~0x39。

在分析二进制时,如何知道是两个字节还是四个字节表示一个字符?看第二个字节的范围,如果是0x30~0x39是四个字节,因为两个字节编码中的第二个字节比这个大。

Unicode编码

如果上述编码可以表示中英文所需的字符,那么世界上有各种各样的国家语言,每个国家都是基于ASCII要实现一套编码标准,就会有成千上万套编码。那就没有世界统一的标准了?有,这就是Unicode编码!

Unicode有一件事是,世界上所有的字符都分配了一个唯一的数字编号,从0开始x000000~0x10EEEF,包括110多万。但大多数常用字符都是0x0000~0xEEEF之间,即65536个数字。每个字符都有一个Unicode编号,这个编号一般写成16进制,加在前面U 。大多数中文的编号范围是U 4E00~U 9FFF。

简单理解,Unicode这样做的一件事就是把唯一的数字编号分配给所有的字符。它没有规定如何对应二进制,这与上述其他代码不同。其他代码不仅规定了哪些字符可以表示,还规定了每个字符对应的二进制是什么Unicode只规定每个字符的数字编号。目前常用的编码方案有UTF-8、UTF-16以及UTF-32。

UTF-8

UTF-8用变长字节表示每个字符使用的字节数及其数量Unicode编号号大小有关,编号小使用字节少,编号大使用字节多,使用字节数为1~4。小于128的,编码与ASCII代码相同,最高位为0。其他编号的第一个字节有特殊的含义,最高的连续1表示几个字节,其他字节从10开始。

对于一个Unicode编号,具体怎么编码?首先将其视为整数,转化为二进制形式(去位0).然后将二进制位从右到左依次填充到相应的二进制格式x中。填充后,如果对应的二进制格式有未填充的x,则设置为0。

UTF-16

UTF-使用变长字节表示:

1)编号在U 0000~U FFFF直接用两个字节表示的字符(常用字符集)。需要注意的是, U D800~U DBFF其实编号没有定义。

2)字符值在U 10000~U 10FFFF四个字节需要表示字符(也称为补充字符集)。前两个字节叫高代理项,范围是U D800~U DBFF;后两个字节被称为低代理项,范围是U DC00~U DFFF。这里就不详细介绍数字编号和二进制之间的转换算法了。

区分是两个字节还是四个字节表示一个字符取决于前两个字节的编号范围U D800~U DBFF,是四个字节,否则是两个字节。

UTF-32

最简单的是字符编号的整数二进制形式,四个字节。

但有一个细节节,就是字节的排列顺序。如果第一个字节是整数二进制的最高位,最后一个字节是整数二进制的最低位,那么这个字节序就叫天端(Big Endian,BE),否则,就叫小端(Little Endian. LE)。对应的编码方法分别是UTF-32BE和UTF-32LE。

可以看出,每个字符都用四个字节表示,非常浪费空间,实际使用较少。

Unicode编码小结

Unicode世界上所有字符都有统一的编号,编号范围超过110万,但大多数字符在65536以内。Unicode没有规定如何将这个数字对应到二进制。

UTE-32/UTE-16/UTE-8都在做一件事,那就是把Unicode编号对应于二进制,对应方法不同。UTF-32使用4个字节,UTF-大部分是两个字节,少部分是四个字节,都不兼容ASCII编码有字节顺序的问题。UTF-8用1~4字节表示兼容ASCII编码,英文字符使用一个字节,中文字符大多使用三个字节。

编码转换

有了统一的Unicode编码后,可兼容不同类型的编码格式,比如中文西字:

编码方式

十六进制

编码方式

十六进制

GBK

cef7

UTF-8

西

Unicode

\西

UTF-16

897f

如何通过不同的编码格式Unicode编码兼容怎么样?它必须通过编码进行转换。我们可以认为每个编码都有一个映射表来存储其独特的字符编码和Unicode这个映射表是一种简化的说法,实际上可能是一种映射或转换方法。

编码转换的具体过程可以是:从A编码到B编码,首先找到A编码格式,通过A映射表找到Unicode编号,然后通过Unicode检查B的映射表,找到字符的B编码格式。

编码转换的具体过程可以是:从A编码到B编码,首先找到A编码格式,通过A映射表找到Unicode编号,然后通过Unicode然后检查B的映射表,找到字符的B编码格式。通过这种转换,可以实现不同编码格式的兼容性。

比如西从GBK转到UTF-8,先查GB18030->Unicode编号表,得到它的编号是\西,然后查Uncode编号->UTF-8表,得到其UTF-8编码: 西。

乱码的根源

上面介绍了编码 ,现


电脑