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