前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >乱码,乱码

乱码,乱码

作者头像
奋飛
发布2019-08-15 09:45:41
4K0
发布2019-08-15 09:45:41
举报
文章被收录于专栏:Super 前端

当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。二进制数据是用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. 字符串长度
code1
code1

注意:汉字

不能被识别
不能被识别

的码点是0x20BB7,UTF-16编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节储存。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2。

2. 访问字符串中特定字符的方法
code2
code2

注意:”≈”,charAt方法无法读取整个字符

3. ES6提供了正确处理4个字节储存的字符
code3
code3

*特别说明:由于CSDN博客编码问题,导致文中”

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年12月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、字符编码
    • 1. ASCII码
      • 2. Unicode
        • 3. ASCII编码和Unicode编码的区别
          • 4. UTF-8
            • 5. UTF-8、UTF-16、UTF-32区别
            • 二、编码转换
            • 三、JavaScript中的编码
              • 1. 字符串长度
                • 2. 访问字符串中特定字符的方法
                  • 3. ES6提供了正确处理4个字节储存的字符
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档