使用非英文键(101)键盘进行输入,不少字符都无法正常输出,这应该算是一个还蛮常见的国际化问题,虽然其root cause千差万别。本文即将讲述一个用意大利键盘输入组合键时发生的异常情况,并尝试分析失效现象背后的一种技术可能。

业务背景是这样的,当用户在local client端用意大利键盘输入组合键Alt Gr+@时,remote端的notepad中显示字符[[[[,而其他按键则完全没有输出。

这种情况下,大家的第一反应应该都会是keyboard mapping问题吧?嗯~~~如果这是一个standalone按键,那么mapping table几乎就无法为自己洗脱犯罪嫌疑了。但本例恰恰是一个组合键的特例,真凶应该另有他人。

走读WebSocket部分代码,不难发现本例中的元凶还不止一个!应属于协同作案。首先在frameData的读取问题上,ByteBuffer并未在put写模式后调用flip进入读模式。

public void frameData(ByteBufferinputBuffer, ByteBuffer workingBuffer, WebsocketUtils utils) {workingBuffer.clear();workingBuffer.put(frameData(inputBuffer, utils));
}

其次在对data Length进行比较的时候,存在明显的逻辑漏洞。

/*** @return The number of bytes the frame willadd to a byte array of this length*/
public intgetFrameOverheadExcludingMask(int dataLength) {if (dataLength < SMALL_FRAME_DATA_LEN) {return FRAME_HEADER_OVERHEAD + SMALL_FRAME_SIZE_OVERHEAD;} else if (dataLength >= SMALL_FRAME_DATA_LEN ) {return FRAME_HEADER_OVERHEAD + EXT_SIZE_OVERHEAD +MEDIUM_FRAME_SIZE_OVERHEAD;} else if (dataLength >= MEDIUM_FRAME_DATA_LEN ) {return FRAME_HEADER_OVERHEAD + EXT_SIZE_OVERHEAD +LARGE_FRAME_SIZE_OVERHEAD;}
}

修改后的示意代码如下。

public intgetFrameOverheadExcludingMask(int dataLength) {if (dataLength < SMALL_FRAME_DATA_LEN) {return FRAME_HEADER_OVERHEAD + SMALL_FRAME_SIZE_OVERHEAD;} else if (dataLength < MEDIUM_FRAME_DATA_LEN ) {return FRAME_HEADER_OVERHEAD + EXT_SIZE_OVERHEAD +MEDIUM_FRAME_SIZE_OVERHEAD;} else {return FRAME_HEADER_OVERHEAD + EXT_SIZE_OVERHEAD +LARGE_FRAME_SIZE_OVERHEAD;}
}public void frameData(ByteBufferinputBuffer, ByteBuffer workingBuffer, WebsocketUtils utils) {workingBuffer.clear();workingBuffer.put(frameData(inputBuffer, utils));workingBuffer.flip();
}

当然除了对这些主犯重构再造外,还需要修改一些从犯,才能彻底修复问题,这里不再一一罗列。反思本案例,严格来讲,他其实很难称得上一个真正的国际化问题,而是byte array长度导致的溢出,只不过用非英文键盘(例如意大利键盘)更容易触发而已。另外考虑到各个网络传输协议的特殊性,也许大家永远不会碰到和我完全一致的情况,然而一旦面临组合键的国际化键盘+remote输入模式时,byte array的length应该会是一个很好的突破口哦!

非英文键盘组合键失效的一种可能相关推荐

  1. Ctrl+Shift+C组合键失效,复制文本格式的组合键失效

    突然碰到Ctrl+Shift+C组合键失效的情况,搜索了一圈,才发现原来是AMD显卡驱动更新后,有一个同样的快捷键起冲突了,AMD当中有一个切换摄像头的快捷键也是Ctrl+Shift+C 打开AMD显 ...

  2. 【杂项】笔记本键盘 “Win+字母“快捷组合键失效 解决过程记录

    首先说明一下,我用方法2解决了问题,我用的是笔记本+win10系统. 解决方法1 转载地址原文:https://blog.csdn.net/xiaomageit/article/details/699 ...

  3. android组合按键截屏,三星安卓手机截图组合键图文汇总(4种)

    三星安卓手机因其综合性价比高的优势,在智能手机市场的份额非常大.所以,很多用户对三星安卓手机的一些功能都非常熟悉,比如:三星手机也有手机截图组合键,不过,三星拥有4种的组合键,不知道大家是否都了解,这 ...

  4. 关于在windows7系统下,win+上下左右组合键失效的问题

    解决办法: xcnokian82 UID 903294 帖子 22 PB币 111 贡献 0 技术 0 活跃 1 7F 发表于 2010-2-4 15:46:15 |生成文章 经过艰苦的努力,终于在远 ...

  5. 列名无效怎么解决_电脑win键失效怎么办? 键盘win键无效的解决办法

    电脑win键失效怎么办?在使用windows系统的时候,发现一个问题,就是win键失效了,怎么按都没有反应,该怎么办呢?羡慕我们就来分享键盘win键无效的三种解决办法,需要的朋友可以参考下 对于编程人 ...

  6. 计算机调出任务管理器的组合键是,如何打开任务管理器 打开任务管理器的方法【方法详解】...

    任务管理器怎么打开?任务管理器在电脑维护应用中运用十分广泛,通过使用任务管理器不仅可以轻松查看电脑CPU与内存的使用情况,还可以查看电脑网络占用情况.通过任务管理进程还可以知道目前电脑中运行了哪些程序 ...

  7. 计算机win e怎么按,win7电脑中的Win+E组合键无法使用怎么办?

    在操作电脑的时候,更多的用户习惯使用键盘上的快捷键,也就是组合键的方式来进行操作,因为对于很多用户来说,组合键的方式操作起来更加的方便,办事的效率也会相应的提高很多,例如咱们经常使用到的ctrl+A的 ...

  8. win键不可用 / win+r、win+e等组合键不可用

    目录 一.只有组合键失效,win键依然有反应 1.修改本地组策略编辑器 2. 尝试重新启动explorer.exe, 3.修改注册表(我是这个办法修好的) 二.只按win键也没反应 一.只有组合键失效 ...

  9. 游戏使用的组合键(热键)被占用的一种解决方案

    最新学习Unity的Animator,做了一个简单的控制人物待机.走跑和跳跃动作的study project.其中一个控制规则是按下W走,按下Shift+W跑,按着Shift+W的同时按空格键则播放跳 ...

最新文章

  1. Find Code for Research Papers
  2. 中国工业节能减排产业项目盈利模式及投资风险预警报告2021-2027年
  3. iphone 系统文件夹
  4. Linux命令:iptables网络防火墙
  5. 2021年香河一中高考成绩查询,2021年廊坊高考状元名单公布,廊坊文理科状元是谁多少分...
  6. 第一章 ASP.NET MVC简介(1.1)
  7. IS-IS详解(九)——IS-IS 骨干区域与非骨干区域访问基础
  8. 【转载】Android面试题集
  9. vue使用下载插件来完成下载文件
  10. 关于动态库so的makefile编写
  11. Django新手十个开发指导
  12. 点球大战中的概率问题
  13. 超阅科技001:冰火九重天
  14. 安卓配置正式包和测试包不同的名字、图标、同时安装,(极光配置测试和正式)
  15. 如何获取系统下目录的文件系统类型
  16. 蓝桥杯刷题007——七段码
  17. 使用selenium抓取网页内容
  18. MySQL练习题初级45题(统一表)
  19. ubuntu windows远程桌面 xfce4
  20. 给网赚从业者的几点建议

热门文章

  1. Android App Bundle基础入门
  2. 最近在 mac 上装 brew 和 upx 的折腾经过
  3. 16位、32位、64位单片机数据类型占用空间对比
  4. java方法用泛函_关于函数式语言的只言片语
  5. c语言程序设计p36答案,C语言程序设计模拟试题A附答案
  6. postfix+squirrelmail实现邮件服务器
  7. Ubuntu安装vncviewer
  8. 基于Java毕业设计医院住院部管理源码+系统+mysql+lw文档+部署软件
  9. @Async注解其实也就这么回事
  10. 上海市计算机三级《信息技术与数据库技术》(2019) 答案+思路