javascript基础之字符集与编码

本篇文章是本人纯手写,若有错误或者论述不当,欢迎各位同行给予指出。javascript

前言

我在看<<JavaScript权威指南>的时候,给咱们介绍了javascript的所使用的字符集是Unicode。因而我就开始慢慢了解javaScript与Unicodehtml

什么是Unicode?

按Unicode官方的说法,Unicode是Unicode Standard(Unicode标准)的简写,因此Unicode便是指Unicode标准。
按wiki的说法,它是一个计算机工业标准(a computing industry standard)。
因此咱们先须要明白两个概念,字符集编码java

字符集

这里我重点推荐字符集与编码这篇文章,对字符集说的很详细。若是还有不清楚"字符集"的小伙伴。我这里能够给小伙伴们形象的举例说明下。字符集能够类比于咱们的身份证系统,咱们每一个人都是有一个身份证号,字符集中的每个展现的字符都有字符编号。好比你是张三,你的身份证号就是XXX1,你是王二,身份证号就是XXX2。你拿身份证在中国是能分辨出你是谁。可是你去美国,人家是不认你的身份证,你须要有美国中相关证件,人家美国才能分辨你是谁,否则,你就被当作非法移民。同理,在字符集中。一个中文字符"好",在Unicode编号是【597d】,你把【597d】放到到ASCII字符集中,ASCII字符集就识别不出是"好"字了,会出现一些莫名奇妙的乱码。就会有不少不一样的字符集。咱们这些小伙伴们只要记住所谓字符集就是一个标准,一个规范,可是不一样的字符集中标准和规范是不同的那字符集能用来干吗呢? 主要是用来指导咱们在计算机中去定位字符。既然定位字符,天然就会给每一个字符定义一个编号,编号确定是惟一的,不用想,否则你一个编号去定位两个或者多个字符,那计算机就没法判断你所须要的字符是哪一个。字符集中,如何定义那个字符的编号,这事已经不须要咱们关心了。ASCII字符集、GBK字符集、Unicode字符集,都已经有官方的组织帮咱们定义好了,咱们只管使用就行。固然,世界上如今最通用的字符集就是Unicode啦正则表达式

编码

这里我重点推荐字符集与编码(二)——编号 vs 编码这篇文章,对编号与编码说的很详细。我总结一句话就是: 编码就是对字符集中的编号进行编码网络

注意!!!字符集中 编号是固定的,可是对其中的 编号进行 编码方式是多种多样的
拿咱们经常使用的Unicode字符集举例,就有UCS-二、UTF-八、UTF-1六、UTF-32等多种编码方式。

为了让小伙伴们更好的了解编码是什么,我这里作了一个小试验。
打开 Ultraedit,建立一个文件,名称叫作a.js。里面输入一个字符"好"
clipboard.png
里面的文件编码方式是UTF-8,咱们还能够经过查看16进制查看该字符的存储编码是E5A5BD,表示三个字节。
clipboard.png
可能有小伙伴觉很奇怪,UTF-8是属于Unicode字符集么。那么保存的16进制应该就是597d,怎么变成了E5A5BD。
这里给这些小伙伴解答一下疑惑。咱们须要明白UTF-8是一种编码方式,它会按照必定的规则对Unicode中字符的编号进行转换,既然通过转化,就不可能存储仍是原始的字符的编号。咱们在上面看到的16进制。已是通过UTF-8对这个字符的编号进行转换事后的内容,不是它原始的编号【597d】。一样的,当咱们用的电脑去读取上面存储的文本的(16进制的E5A5BD),电脑也是须要必定的规则去把内容转化为Unicode的编号。
为了验证读取也是须要规则的想法,咱们把编码变成UTF-16LE,咱们再看文本,就变成了乱码
clipboard.png
咱们查看里面的16进制内容,依然是没有发生变化
clipboard.png
为何变成了乱码,由于存储的规则(UTF-8)与读取的规则不同(UTF-16LE),因而就致使了乱码。可是读取时候存储的文件内容是没有变化的,仍是E5A5BD。只是显示给用户看的时候,变成了乱码。学习

在这里给小伙伴们saowie总结一下。 所谓编码其实就是对字符集里面的编号进行转换的规则。像UTF-8有UTF-8的规则(PS: UTF-8转Unicode的转换规则网络资料不少,自行百度、google,这里再也不补充), UTF-16LE有UTF-16的规则,当咱们在保存和读取文件时候,须要告诉咱们的计算机是什么规则。好让咱们的计算机去经过相应的规则去获取对应的字符。(PS:固然如今不少软件默认编码方式是UTF-8, 已经给咱们定义好了,不须要咱们去特地更改编码)。google

JavaScript与Unicode

如今你们对字符集合字符编码应该已经不陌生了, 下面咱们一块儿探讨下,JavaScript与字符集的关系。
这里咱们能够参考阮一峰的Unicode与JavaScript详解,说的很不错。
这里我给小伙伴们指出一下重点: javaScript是使用Unicode字符集的,但它的编码方式是UCS-2(历史缘由),而且UCS-2的编码与Unicode的编号几乎同样。因此,咱们能够在JS中直接使用转义后Unicode的编号就能获取对应字符,好比u597d => 好。编码

最后,这里给小伙伴们补充几个例子,用于加深理解。
A1. JS中获取字符的几种方式
A. 直接经过键盘输入, 这个很少说
B. Unicode转义序列, javaScript中能够经过6位ASCII码来表示一个Unicode编码, 其中u是前缀,后面4位16进制数,也就是你想要字符的编号来获取相应的字符。spa

console.log('\u597d')  // => 好
console.log('\u6211')  // => 我

C. 经过String.fromCharCode获取字符, javaScript中给开发人员提供了一个能够经过Unicode编号直接获取字符的API。String.fromCharCode.net

String.fromCharCode(0x6211, 0x4e00) // => 我一

A2. 判断是不是中文

// /^[\u4e00-\u9fa5]+$/ 验证汉字的正则表达式
function isAllChinese(str) {
    return /^[\u4e00-\u9fa5]+$/.test(str);
}
咱们只是须要把中文的Unicode编号范围圈出来,而后判断字符是否在此范围内便可。

A3. javaScript获取字符的Unicode编号

var str = '好好学习';
for (var i = 0, length = str.length; i < length; i++) {
  console.log(str.codePointAt(i).toString(16)) //=> 597d 597d 5b66 4e60 
}
文章中所用 Unicode编号在其余文章中被称为 码点,两个所指都是同一个内容,望小伙伴们不要误解