JavaScript中的Unicode和字符串内部结构

个人主页:《爱蹦跶的大A阿》

当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

​ 

✨ 前言

        在我们的日常生活中,JavaScript已经成为了一种无处不在的编程语言。它的应用范围从简单的网页动画,到复杂的前端框架,再到后端的Node.js,甚至还包括物联网设备。然而,JavaScript并非一成不变,它一直在发展,一直在添加新的特性和功能。今天,我们将探讨JavaScript中的一个重要的概念:Unicode和字符串内部结构。在这篇文章中,我们将详细介绍Unicode,包括它的定义、使用方法、代理对,以及如何在不支持Unicode的浏览器中进行polyfill。

✨ 正文

Unicode和字符串

        JavaScript字符串基于Unicode:每个字符由1-4字节的字节序列表示。JavaScript允许我们通过指定其十六进制Unicode代码将字符插入字符串,有以下三种表示法:

// \xXX
// XX必须是两个十六进制数字,值在00和FF之间,然后\xXX是Unicode代码为XX的字符。
alert( "\\x7A" ); // z
alert( "\\xA9" ); // ©, 版权符号

// \uXXXX
// XXXX必须是4个十六进制数字,值在0000和FFFF之间,然后\uXXXX是Unicode代码为XXXX的字符。
alert( "\\u00A9" ); // ©, 与\xA9相同,使用4位十六进制表示法
alert( "\\u044F" ); // я, 西里尔字母
alert( "\\u2191" ); // ↑, 向上箭头符号

// \u{X…XXXXXX}
// X…XXXXXX必须是1到6字节的十六进制值,介于0和10FFFF之间(Unicode定义的最高代码点)。
alert( "\\u{20331}" ); // 佫, 罕见的中文字符(长Unicode)
alert( "\\u{1F60D}" ); // \uD83D\uDE0D, 笑脸符号(另一个长Unicode)

代理对

        所有常用字符都有2字节代码(4个十六进制数字)。大多数欧洲语言的字母、数字以及基本统一的CJK表意文字集(CJK – 来自中文、日文和韩文的书写系统)都有2字节表示。最初,JavaScript基于只允许每个字符2字节的UTF-16编码。但是2字节只允许65536种组合,这对于所有可能的Unicode符号来说是不够的。因此,需要超过2字节的罕见符号用一对2字节字符编码,称为“代理对”。

alert( '\uD835\uDCB3'.length ); // 2, 数学脚本大写X
alert( '\uD83D\uDE02'.length ); // 2, 喜泪的脸
alert( '\uD867\uDDF6'.length ); // 2, 罕见的中文字符

Unicode:修饰符 “u” 和类 \p{…}

        JavaScript使用Unicode编码字符串。大多数字符用2字节编码,但这只能表示最多65536个字符。这个范围不足以编码所有可能的字符,这就是为什么一些罕见的字符用4字节编码,例如\uD835\uDCB3(数学X)或\uD83D\uDE04(笑脸),一些象形文字等等。

alert('\uD83D\uDE04'.length); // 2
alert('\uD835\uDCB3'.length); // 2

        默认情况下,正则表达式也将4字节的“长字符”视为一对2字节的字符。并且,就像字符串一样,这可能会导致奇怪的结果。我们稍后会在文章Sets and ranges […]中看到这一点。与字符串不同,正则表达式有修饰符u,可以解决这些问题。有了这个修饰符,正则表达式可以正确处理4字节字符。并且还可以使用Unicode属性搜索,我们接下来会讲到。

 

let str = "A ბ ㄱ";
alert( str.match(/\p{L}/gu) ); // A,ბ,ㄱ
alert( str.match(/\p{L}/g) ); // null (没有匹配项,\p在没有修饰符"u"的情况下不起作用)

        Unicode的每个字符都有很多属性。它们描述了字符属于哪个“类别”,包含了关于它的各种信息。例如,如果一个字符有Letter属性,那么它就属于字母(任何语言)。Number属性表示它是一个数字:可能是阿拉伯数字或中文数字等等。我们可以搜索具有某个属性的字符,写作\p{…}。要使用\p{…},正则表达式必须有修饰符u。

let regexp = /\p{Sc}\d/gu;
let str = `Prices: $2, €1, ¥9`;
alert( str.match( regexp) ); // $2,€1,¥9

        希望这个概述能帮助你理解JavaScript中的Unicode和字符串内部结构,并为你的博客文章提供一个良好的起点。如果你需要更多的信息或者对某个部分有更深入的问题,欢迎随时向我提问!

✨ 结语

        JavaScript的Unicode和字符串内部结构为我们打开了一个全新的世界,让我们能够在JavaScript中处理任意大小的字符。虽然Unicode在一些方面与常规的字符有所不同,但是只要我们理解了这些差异,并知道如何正确地使用Unicode,我们就能够充分利用它的强大功能。无论你是正在处理大数据,还是在进行高精度计算,Unicode都能够提供强大的支持。希望这篇文章能够帮助你理解和掌握JavaScript中的Unicode和字符串内部结构,让你在编程的道路上更进一步。如果你有任何问题或者需要更深入的讨论,欢迎随时向我提问!

你可能感兴趣的:(JavaScript保姆级教程,javascript,开发语言,ecmascript,前端)