如何解决拉丁字符转西里尔字符脚本中nj、lj等字符转换失效的问题
问题原因
你当前的遍历逻辑每次仅提取1个字符做匹配,而nj、lj这类待转换的组合是双字符,单字符读取逻辑永远匹配不到双字符的转换规则,因此这部分转换失效。
修复方案
调整遍历逻辑,每次优先检查当前位置的后2个字符是否存在匹配规则,匹配成功则直接转换双字符、同时索引步长+2跳过下一个字符;匹配失败再按单字符转换、索引步长+1即可。
修复后的完整代码如下:
if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (obj, fromIndex) { if (fromIndex == null) { fromIndex = 0; } else if (fromIndex < 0) { fromIndex = Math.max(0, this.length + fromIndex); } for (var i = fromIndex, j = this.length; i < j; i++) { if (this[i] === obj) return i; } return -1; }; } function keyupEmail (p_field) { m_key = fix_email_chars(p_field.value); p_field.value = m_key; } function fix_email_chars (p_value) { var m_to_fix = new Array ("a", "b", "v", "g", "d", "đ", "e", "ž", "z", "i", "j", "k", "l", "lj", "m", "n", "nj", "o", "p", "r", "s", "t", "c", "u", "f", "h", "c", "c", "dz", "s", "A", "B", "V", "G", "D", "Đ", "E", "Ž", "Z", "I", "J", "K", "L", "LJ", "M", "N", "NJ", "O", "P", "R", "S", "T", "C", "U", "F", "H", "C", "C", "DZ", "S", "s", "đ", "c", "c", "ž", "S", "D", "C", "C", "Ž"); var m_fixed = new Array ("а", "б", "в", "г", "д", "ђ", "е", "ж", "з", "и", "ј", "к", "л", "љ", "м", "н", "њ", "о", "п", "р", "с", "т", "ћ", "у", "ф", "х", "ц", "ч", "џ", "ш", "А", "Б", "В", "Г", "Д", "Ђ", "Е", "Ж", "З", "И", "Ј", "К", "Л", "Љ", "М", "Н", "Њ", "О", "П", "Р", "С", "Т", "Ћ", "У", "Ф", "Х", "Ц", "Ч", "Џ", "Ш", "š", "đ", "č", "ć", "ž", "Š", "Đ", "Č", "Ć", "Ž"); var m_output = ""; var i = 0; while (i < p_value.length) { // 优先匹配双字符组合 if (i + 1 < p_value.length) { var twoChar = p_value.substring(i, i + 2); var m_index = m_to_fix.indexOf(twoChar); if (m_index > -1) { m_output += m_fixed[m_index]; i += 2; continue; } } // 双字符匹配失败则匹配单字符 var singleChar = p_value.charAt(i); var m_index = m_to_fix.indexOf(singleChar); if (m_index > -1) { m_output += m_fixed[m_index]; } else { m_output += singleChar; } i += 1; } return m_output; }
额外优化建议
你当前的m_to_fix数组里存在多个重复的单字符项,比如c、s都重复出现了多次,indexOf只会匹配第一个出现的项,可能会导致不符合预期的转换结果,建议清理重复的映射规则。
内容的提问来源于stack exchange,提问作者Dejo
相关产品推荐
相关产品推荐

