1. 首页
  2. 生活常识
  3. 乱码文字怎么打出来的(乱码文字输出方法)

乱码文字怎么打出来的(乱码文字输出方法)

简介:关于乱码文字怎么打出来的(乱码文字输出方法)的相关疑问,相信很多朋友对此并不是非常清楚,为了帮助大家了解相关知识要点,小编为大家整理出如下讲解内容,希望下面的内容对大家有帮助!
如果有更好的建议或者想看更多关于生活常识技术大全及相关资讯,可以多多关注茶馆百科网。

当我们处理文件或程序字符时,我们有时会遇到乱码,这些乱码的情况非常令人困惑。很多时候,就是CV到一定程度,看看博客上是否有类似的情况,如果有,那么就按照博客上的方式一步步解决问题,如果没有,很多人直接emo。实际上,乱码听起来很复杂,但解决起来并不难。今天,我们来谈谈如何解决字符编码和乱码的问题。

编码是将信息从一种形式或格式转换为另一种形式的过程,也称为计算机程序设计语言的代码编码。编码用预先确定的方法将字、数字或其他物体编码为数字,或将信息或数据转换为指定的电脉冲编码广泛应用于电子计算机、电视、遥控和通信等领域。编码是将信息从一种形式或格式转换为另一种形式或格式的过程。解码是与编码相反的过程。

在日常的发展中,有很多编码格式,比如GBK、UTF-8、ASCII等等,很多人并不清楚这些编码格式之间的区别,只知道编码和解码的格式与同类码不会发生乱码。实际上,在计算机软件编码领域分为两类,一类是Unicode编码,另一类是非Unicode编码。

常用的非unicode编码包括ASCII、GBK、GB18030、ISO8859-1、windows-1252等。

我们都知道世界上第一台计算机诞生在美国,当时的作者并没有考虑那么多,只考虑了美国的需要(美国大约使用128个字符),所以规定了128个字符的二进制表示方法,也就是一套标准,即ASCII。美国信息交换标准代码

计算机存储的最小单位是字节,即8位。128个字符可以用7位表示。在ASCII中,最高位设置为0,其余7位可以用0~127个字符表示。

需要注意的是,ASCII中有一些特殊的不可打印字符,常见的不可打印字符有

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

什么是编码

ISO 8859-1,又称Latin-1,使用一个字节来表示一个字符,其中0 ~ 127与ASCII相同,128 ~ 255表示不同的含义。在128~255中,128~159代表一些控制字符,160~255代表一些西欧字符,这些字符在中国不常用,我就不详细介绍了。

ISO 8859-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-1252使用这些数字中的一些来表示可打印的字符

编码分类

这三种编码格式相信国内的开发人员并不陌生,这三种也是汉字显示的编码格式,这三种之间有什么区别和联系呢?

一个字节对于美洲和西欧字符是足够的,但对于中文显然是不够的。第一个中国标准是GB2312。GB2312标准主要针对普通简体字,包括约7000个汉字和一些罕见的繁体字。

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

GBKGBK以GB2312为基础,向后兼容GB2312,即GB2312编码的字符和二进制表示在GBK中完全相同。GBK增加了14000多个字符,包括繁体字在内,总共约21000个字符。

GBK由同一主体中的两个固定字节表示。高字节的取值范围是0x81 ~0xFE,低字节的取值范围是0x40 ~0x7F和Ox80 ~0xFE。

注意,低字节从Ox40(即64)开始,这意味着低字节的最高位可能是0。你怎么知道它是中文字符的一部分还是ASCII字符的一部分?其实很简单,因为汉字是用固定的两个字节来表示的。在解析二进制流时,如果第一个字节的最高位为1,则读入下一个字节并将其一起解析为一个中文字符,而不管其最高位是多少。解析后,继续第三个字节。

GB18030GB18030向下兼容GBK,增加5.5万个字符,共7.6万个字符,包括许多少数民族字符,以及中日韩统一字符。

两个字节不再代表GB18030中的所有字符,它使用变长编码,一些字符是两个字节,另一些是四个字节。在双字节编码中,字节表示与GBK相同的范围。在四字节编码中,第一个字节的值为0x81 ~0xFE,第二个字节为0x30 ~0x39,第三个字节为0x81 ~0xFE,第四个字节为0x30 ~0x39。

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

如果上面的代码可以表示中文、英文等所需的字符,那么世界上、各国的语言都是多种多样的,每个国家都根据ASCII实现一套编码标准,那么就会有上千套编码。所以没有统一的标准?是的,这是Unicode编码!

Unicode所做的一件事是为世界上所有字符分配一个唯一的数字编号,范围从0x000000到0x10EEEF,包括超过110万。但是,最常见的字符是在0x0000到0xEEEF之间,即65536位。每个字符都有一个Unicode数字,通常用十六进制写成,前面有U+。大多数中文数字的范围从U+4E00到U+9FFF。

简单地说,Unicode基本上只做一件事:为所有字符分配一个唯一的数字。它不指定数字如何对应于二进制表示,这与上面描述的其他编码相反,这些编码指定可以表示哪些字符以及每个字符对应的二进制,而Unicode本身只指定每个字符的数字编号。常用的编码模式有UTF-8、UTF-16和UTF-32。

非Unicode编码

UTF-8使用可变长度字节。每个字符使用的字节数取决于其Unicode号的大小。较小的数字使用较少的字节,较大的数字使用较多的字节,范围从1到4。如果小于128,表示与ASCII码相同,最高位为0。其他数字的第一个字节具有特殊的含义,具有连续多个1的最高有效位表示几个字节,而其余字节以10开头。

对于Unicode数字,如何对其进行编码?首先,将其视为整数并转换为二进制形式(去掉高0)。然后,从右到左用相应的二进制格式x填充二进制位。填充完成后,如果对应的二进制格式中没有x,则设置为0。

ASCII

UTF-16可变长度字节表示:

1)对于数字范围为U+0000到U+FFFF(通用字符集)的字符,直接用两个字节表示。需要注意的是,从U+D800到U+DBFF的数字没有定义。

2)值在U+10000和U+10FFFF之间的字符(也称为补充字符集)需要用4字节表示。前两个字节称为高代理条目,范围从U+D800到U+DBFF;最后两个字节称为低代理,范围从U+DC00到U+DFFF。在数字编号和这种二进制表示之间有一种转换算法,在这里我不会详细介绍。

2字节和4字节之间的差值表示一个字符,这取决于前两个字节的数字范围。如果是U+D800到U+DBFF,则为4字节;否则就是两个字节。

ISO 8859-1和Windows-1252

这是最简单的,是字符数的整数二进制形式,4个字节。

但是有一个细节,就是字节顺序,如果第一个字节是整型二进制中最高的字节,最后一个字节是整型二进制中最低的字节,那么字节顺序就被称为“Big Endian”(BE),否则,就被称为“Little Endian .le”。对应的编码模式是UTF-32BE和UTF-32LE。

可以看到,每个字符用4个字节表示,这是对空间的浪费,实际使用相对较少。

Unicode为世界上所有的字符提供了一个统一的编号。数字范围大于110万,但大多数字符都在65536以内。Unicode本身没有指定这个数字如何对应于二进制形式。

{"code":-1,"error":"error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length"}

编码方式

十六进制

编码方式

十六进制

GBK

cef7

UTF-8

%u897F

Unicode

\u897f

UTF-16

897f

不同编码之间如何兼容Unicode ?我们可以认为每种编码都有一个映射表,该表存储了其特定字符编码与Unicode编号之间的对应关系。这个映射表是一种简化,实际上可能是一种映射或转换方法。

编码转换的具体过程可以如下:将一个字符从编码A转换为编码B时,首先通过A的映射表找到该字符的A编码格式及其Unicode编号,然后通过B的映射表通过Unicode编号找到该字符的B编码格式。通过这种转换,可以实现不同编码格式之间的兼容性。

例如,如果“west”从GBK转换为UTF-8,则首先查找GB18030-Unicode表并获得其编号\u897f,然后查找Uncode -UTF-8表并获得其UTF-8代码:% u897f。

GB2312、GBK、GB18030

上面介绍了编码,现在我们来看看乱码,乱码一般无非是两个原因:一个是比较简单的错误分析,另一个是比较复杂的,在错误分析的基础上还进行了编码转换。

Unicode编码

一个英国人用Windows-1252编码格式写了一个文件发给一个中国人,然后中国人用GBK解码打开,最后看到的文件是乱码;

0

切换查看编码的方式并不会改变数据本身的二进制格式,而只会改变它的解析方式,从而改变它的外观,这与前面提到的编码转换相反。大多数情况下,在代码视图中进行这样的切换将解决乱码问题,并且大多数简单的解析错误都可以使用此方法解决。

如果您不能改变查看它的方式,那么很可能不仅仅是解析二进制的方式有问题,而且文本是在解析错误之上编码的。让我们举个例子来说明:

例如,“west”的原始编码格式为GBK,编码(十六进制)为cef7。

这个二进制形式被错误地解释为Windows-1252编码,并读取为字符“I ”。

然后对字符进行编码转换,转换成utf-8,形式还是“I present”,但二进制变成111111111111111111111111111111111111111111。

这个时候按照GBK解析,字符会变成乱码形式“?”无论您如何切换到检查编码,二进制看起来都是乱码。

这种情况是造成码乱的主要原因。

这是很常见的,计算机程序经常将所有编码转换成一种方式,如UTF-8,以便更容易地同时完成所有编码。在转换的时候,你需要知道原始的编码是什么,但是你可能会弄错,当你弄错并转换它的时候,你会得到这个烂摊子。在这种情况下,无法在查看编码之间进行切换。

UTF-8

方法处理乱码,如果是简单的方法,可以先用编辑器试着解析一遍,看能否解析回正确的编码;但是,如果遇到稍微复杂一点的情况,比如上面提到的解析加转换错误,说明使用编辑器无法检索到正确的方法,建议使用程序来解决;这里我们使用了一个被误解为“I ”的乱码。让我们检索它的正确编码:

首先,我们编写一个方法,该方法使用数组将所有编码放入其中(我将在这里列出几个),然后使用循环进行解析,然后从输出中查找与原始编码和相应编码匹配的字符。

下面是它的工作原理:

最终运行结果为:

最后,我们得到了“I ”的乱码的原始编码为GBK,被错误地解析为Windows-1252,从而可以找到该字符的原始编码。

根据这个程序可以反向查找原始代码,因为我们实际应用的编码格式有限,所以这种暴力反向搜索的方式还是非常有用的,速度也非常快。

当然,相应的原始代码可以找到的是一些简单而不是很复杂的乱码文件,如果文件被反复错误解析和多次格式转换,解码原始代码的难度与破解未固定的安全密码没有什么不同。

通过本文,我们可以清楚地了解计算机软件领域中编码的分类,分为非Unicode编码和Unicode编码。非Unicode编码主要基于ASCII系统,Unicode编码最常用的方案是UTF-8。这些不同的编码类型可以通过一定的规则相互转换。

编码和解码不使用同一套编码格式,这将导致产生乱码。因此,在生成乱码时,我们可以使用一些编辑器或浏览器来替换编码来查找原始格式,也可以使用程序工具进行暴力匹配,这种方法更加直接有效。

本文主要介绍了关于乱码文字怎么打出来的(乱码文字输出方法)的相关养殖或种植技术,生活常识栏目还介绍了该行业生产经营方式及经营管理,关注生活常识发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解生活常识技术怎么管理的要点,是您生活常识致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://23.234.50.4:8411/article/1484081.html