带特殊字符的字符串转KeyCode数组问题求解决方案
解决特殊字符转正确KeyCode数组的问题
你遇到的核心问题是:直接把字符转成了它的Unicode编码(比如@的Unicode是64),但实际键盘输入@是通过Shift+2完成的,所以需要对应成[16,50]这样的键码组合。下面是具体的解决方案:
核心思路
我们需要建立一个特殊字符与对应键盘按键组合的映射表,然后遍历输入字符串的每个字符:
- 如果是特殊字符,直接取映射表中的键码数组
- 如果是大写字母,拆成
Shift+对应小写字母的键码组合 - 如果是普通小写字母或数字,直接取对应的按键码(这部分的Unicode码和键盘键码一致)
完整代码实现
function convertToKeyCode(text) { // 特殊字符到键盘键码组合的映射表,可按需补充更多字符 const specialCharMap = { '@': [16, 50], '#': [16, 51], '$': [16, 52], '%': [16, 53], '^': [16, 54], '&': [16, 55], '*': [16, 56], '(': [16, 57], ')': [16, 48], '_': [16, 189], '+': [16, 187], '{': [16, 219], '}': [16, 221], '|': [16, 220], ':': [16, 186], '"': [16, 222], '<': [16, 188], '>': [16, 190], '?': [16, 191], '~': [16, 192] }; const results = []; for (const char of text) { // 优先处理特殊字符 if (specialCharMap[char]) { results.push(...specialCharMap[char]); } // 处理大写字母(需要Shift+小写字母的组合) else if (char >= 'A' && char <= 'Z') { results.push(16, char.toLowerCase().charCodeAt(0)); } // 处理普通字符(小写字母、数字等,键码与Unicode码一致) else { results.push(char.charCodeAt(0)); } } return results; } // 测试你的示例 console.log(convertToKeyCode("Hello@Today")); // 输出:[104, 101, 108, 108, 111, 16, 50, 116, 111, 100, 97, 121]
代码说明
- 映射表
specialCharMap:这里覆盖了常见的特殊字符与键盘组合的对应关系,你可以根据实际使用场景补充更多字符的映射。 - 字符遍历逻辑:
- 特殊字符直接通过映射表获取对应的键码数组,用扩展运算符
...将数组元素逐个加入结果列表 - 大写字母需要额外添加Shift键的码(16),再加上对应小写字母的键码(小写字母的键码和它的Unicode码完全一致)
- 普通字符直接取其Unicode码即可,因为这部分的码值和键盘键码是匹配的
- 特殊字符直接通过映射表获取对应的键码数组,用扩展运算符
内容的提问来源于stack exchange,提问作者JustCurious
相关产品推荐
相关产品推荐

