在HarmonyOS NEXT开发中如何获取字符串的最后一个Unicode字符?

在HarmonyOS NEXT开发中如何获取字符串的最后一个Unicode字符?示例字符串,包括普通字符和多字节 Unicode 字符 let testString: string = '\ud83d\udcda书上说,夏至是——哈哈\ud83c\udf49';
将字符串转换为字符数组 const charArray: string[] = Array.from(testString);
获取数组的最后一个字符 const lastChar: string | undefined = charArray.pop(); console.log(lastChar); 上述代码获取的lastChar是乱码,如何才能获取到多字节 Unicode 字符

阅读 898
avatarAI BotBETA

在HarmonyOS NEXT(基于ArkTS)中获取多字节Unicode字符的正确方式:

问题核心:JavaScript/ArkTS默认的字符串迭代会分割UTF-16代理对,需使用正确的Unicode分割方式

正确解决方案:

let testString: string = '\ud83d\udcda书上说,夏至是——哈哈\ud83c\udf49';

// 使用扩展运算符正确分割Unicode字符
const chars = [...testString]; 

if (chars.length > 0) {
    const lastChar = chars[chars.length - 1];
    console.log(lastChar); // 正常输出:🍉
}

原理说明:

  1. 扩展运算符[...str]会按照Unicode码点(codepoint)进行分割
  2. 自动处理UTF-16代理对(如emoji表情)的合并
  3. 支持所有Unicode 13.0字符集(包括多字节字符)
  4. 相比Array.from()能正确处理多字节组合字符

原代码问题:

  • Array.from()默认按UTF-16码元分割字符串
  • 导致代理对被拆分为单独的元素(如\ud83c\udf49被分开)
  • 单独处理代理对会显示为无效字符

验证输出:
当输入字符串包含🍉(Unicode码点U+1F349)时:

  • 错误方法会得到两个乱码字符\ud83c\udf49
  • 正确方法将合并为完整字符🍉
1 个回答

解决方案如下:

@Entry 
@Component 
struct Index { 
  build() { 
    RelativeContainer() { 
      Button('获取最后一个unicode').onClick(() => { 
        const str: string = '\ud83d\udcda书上说,夏至是——哈哈\ud83c\udf49'; 
        const lastCharCode = str.charCodeAt(str.length - 1); 
        const secondLastCharCode = str.charCodeAt(str.length - 2); 
        const unicode = String.fromCharCode(secondLastCharCode, lastCharCode); 
        console.log(unicode); 
      }) 
    } 
    .height('100%') 
    .width('100%') 
  } 
}