2

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

前言

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

什么是Unicode?

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

字符集

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

编码

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

注意!!!字符集中编号是固定的,但是对其中的编号进行编码方式是多种多样的
拿我们常用的Unicode字符集举例,就有UCS-2、UTF-8、UTF-16、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, 已经给我们定义好了,不需要我们去特意更改编码)。

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进制数,也就是你想要字符的编号来获取相应的字符。

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

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

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编号在其他文章中被称为码点,两个所指都是同一个内容,望小伙伴们不要误解

火星田园犬
933 声望685 粉丝

小心驾驶, 专业埋雷