You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中无法获取子串及字符串长度异常问题求助

问题分析与解决方案

问题原因

第一个姓名里的字符属于Unicode补充平面字符(比如示例中的数学粗体无衬线字母,𝙽对应U+1D67D),这类字符在UTF-16编码中会被拆分为两个「代理对」字符存储。而JavaScript的String.length和substring方法都是基于UTF-16代码点计算的,导致原本6个字符的姓名,length返回12;直接调用substring(0,1)只能拿到代理对的一半,因此显示乱码�。

手动输入的Nagesh是ASCII基本平面字符,每个字符仅占1个UTF-16代码点,所以能正常获取长度和首字符。

解决方案

要正确处理这类Unicode字符,需使用支持完整Unicode码位的API:

1. 正确获取首字符

通过codePointAt(0)获取首字符的完整码位,再用fromCodePoint()转回字符:

const contactName = "𝙽𝚊𝚐𝚎𝚜𝚑";
const firstChar = String.fromCodePoint(contactName.codePointAt(0));
console.log(firstChar); // 𝙽

2. 获取真实字符长度

用Array.from()将字符串转为包含完整码位的数组,再取数组长度:

const contactName = "𝙽𝚊𝚐𝚎𝚜𝚑";
const realLength = Array.from(contactName).length;
console.log(realLength); // 6

3. 封装工具函数(可选)

如果需要频繁处理这类场景,可以封装成复用函数:

// 获取首字符
function getFirstNameChar(str) {
  return str ? String.fromCodePoint(str.codePointAt(0)) : '';
}

// 获取真实字符长度
function getRealCharLength(str) {
  return str ? Array.from(str).length : 0;
}

// 测试
const name = "𝙽𝚊𝚐𝚎𝚜𝚑";
console.log(getFirstNameChar(name)); // 𝙽
console.log(getRealCharLength(name)); // 6

额外提示

手机联系人中的这类特殊字符,一般是用户复制的艺术字体文本。如果你的应用UI字体不支持这类字符,可能仍会显示异常,建议做降级处理:将特殊字符转换为对应的普通字母(比如把𝙽转为N),可以通过正则或Unicode映射表实现。

内容的提问来源于stack exchange,提问作者Sumit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:55:17