首页 > 代码库 > 乱码,乱码
乱码,乱码
当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。计算机处理文本,就必须把文本转换为二进制才能处理。
一、字符编码
早期计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。
1. ASCII码
ASCII(美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。比如大写字母A的编码是65,小写字母a的编码是97。由于标准ASCII字符集字符数目有限,在实际应用中往往无法满足要求。
2. Unicode
至于汉字,不同的字符集用的ASCII码的范围也不一样,常用的汉字字符集有GB2312、GBK,至少需要两个字节。全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。解决了传统的字符编码方案的局限性,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
3. ASCII编码和Unicode编码的区别
ASCII编码是1个字节,而Unicode编码通常是2个字节。
- 字母“A”用ASCII编码是十进制的65,二进制的01000001;
- 汉字“中“已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。
如果把ASCII编码的”A“用Unicode编码,只需要在前面补0就可以,因此,”A“的Unicode编码是00000000 01000001。
4. UTF-8
新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
5. UTF-8、UTF-16、UTF-32区别
- UTF-8是一种针对Unicode的可变长度字符编码,英文字母被编码成1个字节,汉字通常是3个字节,节省空间;
- UTF-32每个字符都使用4字节,字节内容一一对应码点,转换规则简单直观,查找效率高;
- UTF-16字符要么是2个字节,要么是4个字节。
二、编码转换
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
示例:用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
示例:浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
<meta charset="UTF-8" />
的信息,表示该网页正是用的UTF-8编码。
三、JavaScript中的编码
1. 字符串长度
注意:汉字的码点是0x20BB7,UTF-16编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节储存。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2。
2. 访问字符串中特定字符的方法
注意:”≈”,charAt方法无法读取整个字符
3. ES6提供了正确处理4个字节储存的字符
特别说明:由于CSDN博客编码问题,导致文中”??”()无法正常展示,所以只能使用截图。实属无奈,敬请谅解!!!
乱码,乱码