首页 > 其他分享 >js 字符串处理函数

js 字符串处理函数

时间:2024-01-11 11:01:06浏览次数:19  
标签:字符 console log 16 js 字符串 message 处理函数 codePointAt

length、charAt()、charCodeAt()和 fromCharCode() 返回的结果都跟预期是一样的。这是因为在这个范围内,每个字符都是用 16 位表示的,而这几个方法 也都基于 16 位码元完成操作。只要字符编码大小与码元大小一一对应,这些方法就能如期工作。

这个对应关系在扩展到 Unicode 增补字符平面时就不成立了。问题很简单,即 16 位只能唯一表示 65 536 个字符。这对于大多数语言字符集是足够了,在 Unicode 中称为基本多语言平面(BMP)。为了 表示更多的字符,Unicode 采用了一个策略,即每个字符使用另外 16 位去选择一个增补平面。这种每个 字符使用两个 16 位码元的策略称为代理对。

在涉及增补平面的字符时,前面讨论的字符串方法就会出问题。比如,下面的例子中使用了一个笑 脸表情符号,也就是一个使用代理对编码的字符:

// "smiling face with smiling eyes" 表情符号的编码是 U+1F60A // 0x1F60A === 128522
let message = "ab☺de";
    console.log(message.length);          // 6
    console.log(message.charAt(1));       // b

这些方法仍然将 16 位码元当作一个字符,事实上索引 2 和索引 3 对应的码元应该被看成一个代理 对,只对应一个字符。fromCharCode()方法仍然返回正确的结果,因为它实际上是基于提供的二进制 表示直接组合成字符串。浏览器可以正确解析代理对(由两个码元构成),并正确地将其识别为一个 Unicode 笑脸字符。

为正确解析既包含单码元字符又包含代理对字符的字符串,可以使用 codePointAt()来代替 charCodeAt()。跟使用 charCodeAt()时类似,codePointAt()接收 16 位码元的索引并返回该索引 位置上的码点(code point)。码点是 Unicode 中一个字符的完整标识。

let message = "ab☺de";
console.log(message.codePointAt(1)); // 98
console.log(message.codePointAt(2)); // 128522
console.log(message.codePointAt(3)); // 56842
console.log(message.codePointAt(4)); // 100 8

注意,如果传入的码元索引并非代理对的开头,就会返回错误的码点。这种错误只有检测单个字符 的时候才会出现,可以通过从左到右按正确的码元数遍历字符串来规避。迭代字符串可以智能地识别代 理对的码点:

console.log([..."ab☺de"]); // ["a", "b", "☺", "d", "e"]

与 charCodeAt()有对应的 codePointAt()一样,fromCharCode()也有一个对应的 fromCodePoint()。 10 这个方法接收任意数量的码点,返回对应字符拼接起来的字符串:

标签:字符,console,log,16,js,字符串,message,处理函数,codePointAt
From: https://blog.51cto.com/u_16273048/9194537

相关文章

  • ImageClipboard js粘贴剪切板图片,已测试,可用,可获得base64
    ImageClipboardjs粘贴剪切板图片,已测试,可用,可获得base64具体用到自己项目的时候,拿源码改成自己的库,从写一遍3个小问题onpaste执行了两遍,一次是图片加载完成,一次是加载图片之前。按说应该搞两个事件来分别调用pasteCatcher应该是作为一个保底实现,我也没看明白是怎么获取剪......
  • mysql修改json字段sql备份
    updatedec_maina,dec_main_copy20240110bseta.ie_Date=b.ie_Date,a.declaration_data=b.declaration_data,a.custom_state=b.custom_state,a.content=JSON_SET(a.cont......
  • 推荐一个页面引导库 driver.js
    页面引导功能是web开发中常见的一个功能。通过页面引导功能,你可以让用户第一时间熟悉你的页面功能。今天给大家推荐一个页面引导库driver.js。简介driver.js是一款用原生js实现的页面引导库,上手非常简单,体积在gzip压缩下仅仅5kb。我们来看下如何使用driver.jsimport......
  • jsp有哪些内置对象
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • js中反斜杠替换问题
    在windows机器上,vscode复制完相对路径,路径为反斜杠想在控制台用js将反斜杠替换为正斜杠,结果失败js的字符串是不能直接写单个反斜杠的letstr='src\aaa\bbb\ccc'实际上会变成'srcaaa\bbbccc'只有\b被保留,应该是当成正则原字符了,待验证而要真正还原反斜杠,需要转义letstr......
  • python第三节:Str字符串类型(2)
    str.format(*args, **kwargs)执行字符串格式化操作。语法:点号前面是一个带槽(由大括号表示)的字符串,字符串里面可以设置各种参数和格式控制标记,后面是format和替换的字符串。{参数序号:格式控制标记}如下六个按照顺序使用。:填空对齐宽度逗号精度类型冒号用于填充的单个字符<左对齐>......
  • js 执行上下文与作用域
    执行上下文(以下简称“上下文”)的概念在JavaScript中是颇为重要的。变量或函数的上下文决定了它们可以访问哪些数据,以及它们的行为。每个上下文都有一个关联的变量对象(variableobject),而这个上下文中定义的所有变量和函数都存在于这个对象上。全局上下文是最外层的上下文。......
  • js typeof
    typeof操作符最适合用来判断一个变量是否为原始类型。更确切地说,它是判断一个变量是否为字符串、数值、布尔值或undefined的最好方式。lets="Nicholas";letb=true;leti=22;letu;letn=null;leto=newObject();console.log(typeof......
  • js 原始值
    原始值和引用值在通过变量复制时也有所不同。在通过变量把一个原始值赋值到另一个变量时,原始值会被复制到新变量的位置。请看下面的例子:letnum1=5;letnum2=num1;这里,num1包含数值5。当把num2初始化为num1时,num2也会得到数值5。这个值跟存储在num1中的5是......
  • js 函数
    函数对任何语言来说都是核心组件,因为它们可以封装语句,然后在任何地方、任何时间执行。ECMAScript中的函数使用function关键字声明,后跟一组参数,然后是函数体。以下是函数的基本语法:functionfunctionName(arg0,arg1,...,argN){statements}下面是一个例子:functionsayHi(......