资讯专栏INFORMATION COLUMN

javascript基础之字符集与编码

sanyang / 2917人阅读

摘要:一个中文字符好,在编号是,你把放到到字符集中,字符集就识别不出是好字了,会出现一些莫名奇妙的乱码。我一判断是否是中文验证汉字的正则表达式我们只是需要把中文的编号范围圈出来,然后判断字符是否在此范围内即可。

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

前言

我在看<的时候,给我们介绍了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。里面输入一个字符"好"

里面的文件编码方式是UTF-8,我们还可以通过查看16进制查看该字符的存储编码是E5A5BD,表示三个字节。

可能有小伙伴觉很奇怪,UTF-8是属于Unicode字符集么。那么保存的16进制应该就是597d,怎么变成了E5A5BD。
这里给这些小伙伴解答一下疑惑。我们需要明白UTF-8是一种编码方式,它会按照一定的规则对Unicode中字符的编号进行转换,既然经过转化,就不可能存储还是原始的字符的编号。我们在上面看到的16进制。已经是经过UTF-8对这个字符的编号进行转换过后的内容,不是它原始的编号【597d】。同样的,当我们用的电脑去读取上面存储的文本的(16进制的E5A5BD),电脑也是需要一定的规则去把内容转化为Unicode的编号。
为了验证读取也是需要规则的想法,我们把编码变成UTF-16LE,我们再看文本,就变成了乱码

我们查看里面的16进制内容,依然是没有发生变化

为什么变成了乱码,因为存储的规则(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编号在其他文章中被称为码点,两个所指都是同一个内容,望小伙伴们不要误解

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107136.html

相关文章

  • WebSocket系列字符串如何二进制数据间进行互相转换

    摘要:总结通过使用和,我们能够在数据和二进制数据中进行互相转换。下一篇系列相关的博客,将会介绍如何通过来向后端传递二进制数据,以及如何处理通过收到的二进制数据。 概述 上一篇博客我们说到了如何进行数字类型(如Short、Int、Long类型)如何在JavaScript中进行二进制转换,如果感兴趣的可以可以阅读本系列第二篇博客——WebSocket系列之JavaScript中数字数据如何转换为...

    stackfing 评论0 收藏0
  • javascript基础String

    摘要:写快一年了发现基础越来越重要写点基础的来共勉以及方便之后回看和不同,是构造函数是变量的一种类型是的实例声明一个字符串之后使用是否包含判断一个字符串是否被包含在另一个字符串中包含返回不包含返回查询包含的字符串从什么位置开始切割字符串获取字符串 写js快一年了,发现基础越来越重要,写点基础的来共勉以及方便之后回看. String和string不同,String是构造函数,string是变量...

    springDevBird 评论0 收藏0
  • Unicode中UTF-8UTF-16编码详解

    摘要:概念是一种针对的可变长度字符编码,又称万国码。通过上面的介绍我们可以知道,是一种非常通用的可变长字符编码方式。概念是字符编码五层次模型的第三层字符编码表,也称为的一种实现方式。 概述 本文通过介绍Unicode编码以及对应的两种编码方式UTF-8和UTF-16,让读者能够了解关于字符串编码的相关知识,同时能够弄清楚Unicode和UTF-8和UTF-16之间的关系。 本文的主要内容为:...

    cod7ce 评论0 收藏0
  • Node闲谈Buffer

    摘要:闲谈系列不涉及具体的讲解,只会勾勾画画一些自己认为比较重要的特性。我们一般认为用两个字节位表示,并且完全囊括了字符集。将其转换成进制就是只是表示它们是码。三的读取和写入相关重要的只有能够读写,才能够显示其存在的价值。 原文地址:http://www.cnblogs.com/DeanCh... 在刚接触Nodejs的时候,有些概念总让学前端的我感到困惑(虽然大学的时候也是在搞后端,世界上...

    Godtoy 评论0 收藏0
  • JavaScript 闯关记》单体内置对象

    摘要:单体内置对象对内置对象的定义是由实现提供的不依赖于宿主环境的对象,这些对象在程序执行之前就已经存在了。还定义了两个单体内置对象和。此外,所有原生引用类型的构造函数,像和,也都是对象的属性。 单体内置对象 ECMA-262 对内置对象的定义是「由 JavaScript 实现提供的、不依赖于宿主环境的对象,这些对象在 JavaScript 程序执行之前就已经存在了」。意思就是说,开发人员不...

    antyiwei 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<