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
相关产品推荐
相关产品推荐

