哈喽小伙伴们 ,今天给大家科普一个小知识。在日常生活中我们或多或少的都会接触到锟斤拷锟_什么是“锟斤拷”? 方面的一些说法,有的小伙伴还不是很了解,今天就给大家详细的介绍一下关于锟斤拷锟_什么是“锟斤拷”? 的相关内容。

61 )


(资料图片仅供参考)

周末女朋友出去逛街,我一个人在家看综艺。突然,女朋友打 *** 给我。

图片来自Pexels

过了一会,女朋友回来了。她拿出手机给我看她在超市拍的照片:

如果你想知道什么是乱码,你需要从计算机编码开始。

字符编码和ASCII

我们经常看一些谍战剧。谍战剧里,敌特、地下党员、八路军各部门 *** 报时,一般都是电报发的。

在电报传输过程中,发送方需要用电键发出不同长度的代码,接收方会听到电报的嘀嗒声。

事实上,电报的声音是“滴”和“答”的组合,“答”的声音是“滴”的三倍长。

发送者首先要以某种方式把他要发送的信息变成电报的滴答声,接收者听到滴答声后会把它们翻译成正常的文字。这个过程就是字符编码和字符解码。

谍战剧中情报进入电报的“滴”“答”音主要使用莫尔斯电码,这是一种字符编码方式,通过不同的排列顺序来表示不同的英文字母、数字和标点符号。

莫尔斯电码由长短电脉冲组成(称为点和划)。并且规定了点划的时间长度,以一个点为基本单位,一个划等于三个点的长度。与电报的“投”和“答”相对应。

就像电报只能发出“滴”和“答”的声音一样,计算机只认识0和1字符。但是,人的性格是多种多样的。如何把人类的字符转换成计算机识别的01字符?这个过程也需要字符编码。

字符编码是一组规则,可用于将自然语言的一组字符(如字母表或音节列表)与一组其他事物(如数字或电脉冲)配对。

类似于莫尔斯电码,20世纪60年代,美国制定了一套字符码,统一规定了英文字符与二进制位的关系。这就是所谓的ASCII码,一直沿用至今。

ASCII(美国信息交换标准码)是一种基于拉丁字母的计算机编码系统。

主要用于显示现代英语,共128个字符,包括所有大小写字母、数字0到9、标点符号以及美式英语中使用的特殊控制字符。

由于ASCII只有128个字符,虽然所有的英文字符都可以表达,但是世界上还有很多其他的字符他不能表达,所以需要一个更全面的字符编码。

在介绍其他字符码之前,先说一个计算机领域常用的字符集。

统一码

Unicode(中文:通用码、国际码、统一码、单码)是计算机科学领域的行业标准。

它对世界上大部分的文字系统进行排列和编码,使计算机能够以更简单的方式呈现和处理文字。

Unicode到现在还在添加中,每个新版本都会添加更多的新字符。最新版本是2019年5月发布的12.1,这个版本只增加了一个新字,就是日本新年的顺序和的组合。

在计算机软件的国际化和本地化过程中,Unicode得到了广泛的认可和应用。许多新技术,如可扩展标记语言、Java编程语言和现代操作系统,都采用了Unicode编码。

Unicode是一种通用字符集,包含了世界上大多数字符。也就是说Unicode可以代表中文。

UTF-8,UTF-16,UTF-32

虽然Unicode统一了全世界字符的编码,但它没有指定如何存储它们。这样做是有考虑的:如果Unicode统一规定每个符号要用3或4个字节来表示,因为字符太多了,只能用这么多字节来表示完整性。

一旦规定了这一点,每个英文字母前必须有2或3个字节的零,因为所有英文字母都是ASCII码,可以用1个字节来表示,剩下的字节会用零来补充。

如果这样的话,文本文件的大小会大两到三倍,这是对存储的极大浪费。

为了解决这个问题,出现了一些中间字符集,称为通用转换格式(UTF)。

常见的UTF格式有:

UTF-7

UTF-7.5

UTF-8

UTF-16

UTF-32

UTF-8:用1到4个字节对每个字符进行编码,UTF-16:用2或4个字节对每个字符进行编码,UTF-32:用4个字节对每个字符进行编码。

所以我们可以说UTF-8,UTF-16等。都是Unicode的实现。

比如Unicode规定一个汉字“I”对应的UniCode是“\u6211”,但是在UTF-8、UTF-16等不同实现下,这个二进制码的存储方式是不一样的。

UTF-8使用可变长度字节来存储Unicode字符。比如ASCII字母继续以1字节存储,重音字符、希腊字母或西里尔字母以2字节存储,常用汉字则需要3字节。辅助平面字符使用4个字节。

GBK,GB2312,GB18030

因为UTF-8是Unicode的一个实现,它包含了世界上所有字符的编码,它使用1-4个字节进行编码。

对于首先被包括在列表中的那些字,可以首先使用1个字节或2个字节来存储,对于后来被包括的字,将使用3个字节或4个字节来存储。

因为他太完整了,后面收录的那些字符可能会有更多的字节存储在UTF-8中,他的存储空需求会非常大。

对于常用的汉字,UTF-8使用3个字节进行编码,但如果有一种编码只包含中文和ASCII,则不需要使用3个字节。也许2个字节就足够了。

对于大多数网站来说,基本上只服务于一个国家或地区。例如,中国的一个网站通常有简繁体和一些英文字符,但很少有日文或韩文。

为此,中国标准总局于1981年制定并实施了GB 2312-80码,即中华人民共和国(PRC)国家标准《简体中文字符集》。

后来,微软公司利用GB 2312-80中未使用的码空,将GB 13000.1-93中的所有字符包括在内,制定了GBK码。

有了标准的中文字符集,如果是纯中文网站,可以采用这种编码方式,可以大大节省一些存储空。

常用的中文编码有GBK、GB2312、GB18030等。最常用的是GBK。

GB2312(1980)是一个16位字符集,包含6763个简体中文字符、682个符号和总共7445个字符:

优点:适用于简体中文环境,属于中国国家标准,在mainland China、新加波等地广泛使用。

缺点:不兼容繁体中文,收藏的汉字太少。

GBK(1995),16位字符集,包含21,003个汉字,883个符号,共21,886个字符:

优点:适用于简繁中文并存的环境,简体Windows使用,向下完全兼容GB2312,向上支持ISO-10646国际标准;所有字符都可以一对一地映射到Unicode 2.0。

缺点:不属于官方标准,需要在big5之间转换;许多搜索引擎不能很好地支持GBK汉字。

GB18030(2000),32位字符集;共记录了27,484个汉字,以及藏、蒙、 *** 尔和其他主要少数民族语言:

优点:可以包含你能想到的所有字符和符号,属于中国最新国标。

缺点:目前支持的软件很少。

错误代码

我们也以前面介绍的电报为例。我们假设以下场景:发送方使用“美国莫尔斯电码”将信息转换成电报,接收方接收电报并通过“现代国际莫尔斯电码”进行解码。那么得到的信息内容可能是完全看不懂的,是乱码。

就像在计算机领域,我们把一串汉字编码,通过UTF-8传输给别人。别人得到这串字符后,通过GBK解码,得到的内容会是“両両両両両両両両両両両𰵁両𰵁𰵁𰵁2

例如下面的代码:

publicstaticvoidmain(String[]args)throwsUnsupportedEncodingException{Strings="漫话编程!";byte[]bytes=s.getBytes(Charset.forName("GBK"));System.out.println("GBK编码,GBK解码:"+newString(bytes,"GBK"));System.out.println("GBK编码,GB18030解码:"+newString(bytes,"GB18030"));System.out.println("GBK编码,UTF-8解码:"+newString(bytes,"UTF-8"));}

输出结果:

GBK编码,GBK解码:漫话编程!GBK编码,GB18030解码:漫话编程!GBK编码,UTF-8解码:????????

如你所见,汉字由GBK编码,然后由UTF-8解码,得到的字符是一串问号,这是乱码。

戴着手铐的前世。

因为Unicode是一直在更新的,在这个过程中,肯定有一些更新的字符是他表达不出来的。

即使发布了新版本的Unicode并包含了一些字符,很多软件系统不升级也会出现这样的问题。

就像生活中一些手机厂商新发布的那些emoji表情,在自己的手机上可以正常显示,但在其他品牌的手机上不一定能显示。其实这也是字符集不支持造成的。

出现以上情况,无法显示时需要有一个字符。在Unicode中,这个字符是,它也是Unicode中定义的特殊字符。

即“0xFFFD替换字符”,所有不能表示的字符都将由该字符表示。

Unicode官方对这个符号有介绍。从上表可以看出,它的十进制表示是65533,在UTF-8下,它的十六进制形式是‘0x ef 0x BF 0x BD’(三个字节)。

如果有两个连续的字符无法显示,如"",那么在UTF-8编码下,十六进制表示为:

0xEF0xBF0xBD0xEF0xBF0xBD

上面的代码,如果放到GBK进行解码,因为一个汉字在GBK有两个字节,那么结果是:

0xEF0xBF,0xBD0xEF,0xBF0xBD

即:

0xEFBF0xBDEF0xBFBD

那么如果显示的话就是matte (0xEFBF)、Jin (0xBDEF)、Kao (0xBFBD)。

因此,当你在未来看到金金副本时,之一时间想到UTF-8和GBK之间的转换是正确的。

除了金抄,还有两组经典乱码,分别是“滚烫”和“吞吞吞”。这两个乱码源于VC,是调试模式下VC对内存的初始化操作。

VC将把堆栈中新分配的内存初始化为0xcc,把堆中新分配的内存初始化为0xcd。按字符打印出0xcc和0xcd,很热。

关键词: 锟斤拷