遍历含重音字符的字符串时,如何将拆分的重音字符作为整体获取?
解决contenteditable文本中组合重音字符拆分的问题
问题根源
你遇到的问题是因为部分带重音的字符以组合字符序列形式存在(比如x + 独立的重音符U+0301),而非预合成的单个Unicode字符(比如ẋ)。遍历字符串时,组合序列会被拆分成多个代码单元,导致无法匹配Accents数据库中的条目。
解决方案
通过Unicode规范化将组合字符序列合并为单个预合成字符,再用正确的遍历方式处理字符串:
- 使用
String.normalize('NFC')规范化字符串
NFC(Normalization Form C)格式会自动将可合并的组合字符序列转换为对应的预合成单个字符,让拆分的重音字符变成和ẋ一样的独立字符。 - 改用
for...of循环遍历for...in遍历的是字符串索引,会拆分组合序列;for...of则能正确识别每个完整的Unicode字符。
修改后的代码
let Accents= { /*...*/ 'x': [ ["x", 0], ["ẍ", 1], // 组合序列x+U+0301经NFC规范化后会转为该预合成字符 ["̂x̂", 2], ["ẍ", 2], ["̌x̌", 2], ["ẋ", 1], ["̧x̧", 1], ["̱x̱", 1], ["̣x̣", 1], ["ᶍ", 2] ], /*...*/ } $("button").on("click", function(){ const text = $(".text").text().normalize('NFC'); for (const char of text) { console.log(char); } })
额外说明
如果Accents数据库中仍保留组合序列格式的条目,可将数据库内的所有字符也统一用normalize('NFC')处理,确保两边格式一致,匹配逻辑不会出错。
内容的提问来源于stack exchange,提问作者Luis Gallego
相关产品推荐
相关产品推荐

