JavaScript中如何将含UTF8和UTF16字符的混合字符串转为UTF8字符串
问题本质澄清
你遇到的是**同形异义字符(Homoglyph)**替换场景,示例里的а(Unicode码点1072,西里尔小写字母a)、е(Unicode码点1077,西里尔小写字母e)和拉丁字母a、e只是字形相似,本质是完全不同的Unicode字符,不属于同一字符的不同编码格式,因此无法直接通过编码转换实现替换,需要做自定义字符映射处理。
实现方案
方案1:手动维护映射表(推荐,适合已知待替换字符的场景)
提前梳理业务中会遇到的同形字符和目标拉丁字符的映射关系,遍历字符串逐字符匹配替换即可,性能最高:
// 同形字符映射表,可根据业务需求补充更多规则 const homoglyphMap = { 1072: 'a', // 西里尔小写а 1077: 'e', // 西里尔小写е 1086: 'o', // 西里尔小写о 1088: 'p', // 西里尔小写р 1089: 'c', // 西里尔小写с 1091: 'y', // 西里尔小写у 1093: 'x', // 西里尔小写х } function convertHomoglyphToLatin(str) { return Array.from(str).map(char => { const charCode = char.charCodeAt(0) return homoglyphMap[charCode] ?? char }).join('') }
测试验证
const mixedString = "Dаtе"; const expectedString = "Date"; console.log(convertHomoglyphToLatin(mixedString) === expectedString) // 输出 true
方案2:全量同形字符处理
如果需要覆盖所有已知的同形字符,可以引入成熟的同形字符处理库,内置了完整的Unicode同形字符映射表,不需要手动维护规则。
内容的提问来源于stack exchange,提问作者gsi
相关产品推荐
相关产品推荐

