码元和码点

简介: 在计算机中,字符存储依赖于其ASCII编码值。JS中,每个字符占用16位(2字节)的空间,称为码元,范围0-65535。当字符所需空间超限时,JS使用两个码元表示,总称码点。处理特殊字符如表情时,需自定义方法以正确识别码点,避免乱码,确保字符串操作准确无误。

码元和码点

1.介绍码元和码点

​ 在计算机中存储字符不是存储一个真正的字符,而是存储这个字符对应的ascll编码值。在js中,一个字符占16位空间也就是2个字节,而这个空间就称之为码元,一个码元的存储空间是0-2的16次方,也就是65535,而在现实生活中我们的文字绝不只这点于是想要存储一个字符所占空间大于65535的话,js就会开两个空间给这个字符,而这个字符所占的全部空间就称之为码点。

2.码元码点的实际用途

在js中,我们通过字符串的length属性实际上是在访问这个字符串所占的码元。

const string = "😭🦐"
console.log(string.length); // 4

所以在开发中我们遇到表情这种占两个码元的字符时,处理起来会有点问题,如:

const string = "😭🦐"
console.log(string.slice(0,1)) // 输出乱码

因为slice方法实际上也是根据字符的码元进行截取,而字符串里的一个字符是占两个码元的所以当我们想截取第一个字符的时候只截取到了他第一个码元,还有一个码元没有截取到,所以会导致乱码。

解决办法就是在字符串原型上添加几个专门处理表情等字符的方法。

一,方法一

​ 在字符串原型上添加pointLength方法,用于获取字符串的码点数量

String.prototype.pointLength = function () {
   
  let len = 0;
  for (let i = 0; i < this.length; ) {
   
    len++;
    const t = this.codePointAt(i);
    i += t > 0xffff ? 2 : 1;
  }
  return len;
};

二,方法二

​ 在字符串原型上添加pointAt方法,用于获取字符串中指定码点索引的字符。

String.prototype.pointAt = function (index) {
   
  let currentIndex = 0;
  for (let i = 0; i < this.length; ) {
   
    if (currentIndex === index) {
   
      const code = this.codePointAt(i);
      return String.fromCodePoint(code);
    }
    currentIndex++;
    const point = this.codePointAt(i);
    i += point > 0xffff ? 2 : 1;
  }
};

三,方法三

​ 在字符串原型上添加pointSlice方法,用于截取指定码点索引的字符。

String.prototype.pointSlice = function (start, end) {
   
  let result = "";

  for (let i = start; i < this.pointLength() && i < end; i++) {
   
    result += this.pointAt(i);
  }
  return result;
};

添加完这三个方法后,以后处理这种表情字符串就容易多了。

const a = "🦐😭😠🏃";

console.log(a.pointLength()); // 4
console.log(a.pointAt(1)); // 🦐
console.log(a.pointSlice(2, 3)); // 😠

3.结语

码元与码点的问题主要会出现在一些偏僻子,表情等字符中,因为这些字符的存储空间超过了2个字节也就是超过了一个码元,所以在进行字符串处理的过程中会出现乱码的问题,通过添加三个处理码元码点的方法,就可以很好的解决这个问题。

相关文章
|
芯片
译码器的介绍
译码器是一种常见的数字电路元件,它用于将输入的编码信号转换为输出的解码信号。在数字系统中,译码器起着非常重要的作用,它能够将编码的数字信号转换为可识别的输出信号,实现数字信号的解码和解析。本文将介绍译码器的原理、分类、应用以及未来的发展趋势。 一、译码器的原理 译码器的原理是基于布尔逻辑运算的。它根据输入的编码信号,通过内部的逻辑门电路进行运算,最终输出对应的解码信号。译码器的输入可以是二进制编码、BCD编码或格雷码等形式,输出可以是十进制数、BCD数或具体的控制信号等。 译码器的内部结构通常由多个逻辑门电路组成,例如AND门、OR门和NOT门等。通过这些逻辑门的组合,译码器可以实现各种不
348 0
|
16天前
|
芯片 开发者
脉冲宽度调制
脉冲宽度调制(PWM)是一种通过调整脉冲信号的占空比来控制功率、亮度或速度等参数的技术,广泛应用于电机控制、电源转换和照明等领域。
|
5月前
计算机网络——物理层-编码与调制(数字基带信号、模拟基带信号、码元、常用编码、基本调制方法、混合调制)二
计算机网络——物理层-编码与调制(数字基带信号、模拟基带信号、码元、常用编码、基本调制方法、混合调制)二
126 0
|
5月前
|
内存技术
计算机网络——物理层-编码与调制(数字基带信号、模拟基带信号、码元、常用编码、基本调制方法、混合调制)一
计算机网络——物理层-编码与调制(数字基带信号、模拟基带信号、码元、常用编码、基本调制方法、混合调制)一
290 0
奈氏准则、香农公式、最大码元速率与最大信息速率
奈氏准则、香农公式、最大码元速率与最大信息速率
823 0
|
6月前
leetcode-717:1比特与2比特字符
leetcode-717:1比特与2比特字符
38 0
|
机器学习/深度学习 资源调度 Shell
信道容量详解
信道容量详解
523 0
信道容量详解
【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)
【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)
128 0
【计算机网络】常见的编码方式:归零、不归零;曼切斯特、差分曼切斯特
【计算机网络】常见的编码方式:归零、不归零;曼切斯特、差分曼切斯特
370 0