|
本帖最后由 mastermind 于 2013-1-2 16:33 编辑
关于这个问题,在论坛搜索了一番,得到的结论倒是很单纯——没门。不过关于这个问题,倒是可以衍生出对于windows剪贴板的很多讨论。
以下涉及实验的部分基于3.3.7.15。
我遇到这个问题是因为想要通过按快捷键在打dota时喊话。这基于想做一个dota的小外挂,实现的功能是通过一个快捷键实现本来很复杂的地卜师“五狗齐飞”操作,通过另一个快捷键实现本来不复杂但是很麻烦的地卜师“五狗原地忽悠”操作。对于打dota的人来说,这些不专业语言意味着什么勿用再言,对于不大dota的人来说,只需要知道这些相当于快速按键盘和点鼠标就够了。
为了添加一点趣味,我设定只要按了快捷键,后台就会对“所有人”进行喊话“大家一起飞啊!”或是“大家一起忽悠啊!”没想到就是这两句话让我遇到了问题。
如果用send(),实验的结果好像是一个字都打不出来;如果用clipput()再send(^v)的方法,实验的结果是出现一堆不知道哪国的字符。
那么,如果进入dota,手动打上这句话,再复制粘贴到记事本中——显然会出现乱码,到这里我们似乎解决这个问题了,因为乱码是可以粘贴到程序中的。仍然使用剪贴板方案实验的结果是,“大家一起飞啊!”原话打出来没问题,但是“大家一起忽悠啊!”,少了一个感叹号。出现的原因正是utf8转码至中文ansi或gbk,再转回来出现的丢字问题。
在madedit这个编辑器中,分别用utf8码和gbk码显示,就会发现一些端倪。
“大家一起飞啊!”的utf8编码是:(编辑框里能写出来,但是发不出来,发到这里就会卡住不让再发了,后面的内容也都会丢失……),总之能够转成gbk,其中有一个单个字节80单独转换成一个字符。
“大家一起忽悠啊!”就没这么幸运,前面那句话一共7个全角字,一共21个字节,有一个单独的80被单独解码,剩下的两个一组很好;这句话8个全角字,一共24个字节,80是“一”的最后一个字节,所以在后面这句话中还有,而全角感叹号的最后一个字节是81,就会被单独剩下,可是81貌似是不能解码的……
或许有人想问,前面还有80呢,怎么81就没有?不要问我,我也不知道……
实际上,如果在dota中,也就是魔兽争霸中复制“大家一起忽悠啊!”这句话,剪贴板上是没有问题的,也可以在魔兽中重新粘贴;但是如果粘到记事本中,会导致最后的81因为无法解码而丢失,如果再复制粘贴回魔兽中,就会导致中文感叹号无法显示。当然,无法显示是无法显示,你会发现,你需要多按几次退格删除键才能把最后一个字删干净,这就是81前面的ef bc因为没有81而无法解码,但它们依然还在那里,需要先删掉这些才能去删除正文。
那么,如果在utf8编码下的madedit中输入“大家一起忽悠啊!”然后粘到剪贴板中呢?这也不行,因为实验表明,就在你复制的那一刹那,windows存到剪贴板中的是这句话的gbk编码……
那么,如果在utf8编码下的madedit中输入“大家一起忽悠啊!”然后切换到gbk再粘到剪贴板中呢?这也不行,windows剪贴板似乎有一个自动忽视不可解码段的设定。
那么,有什么解决的办法呢?很显然是有的,因为war3的助手类软件有很多,喊话都是正常的,目测原理是直接写了剪贴板占有的内存。至少warkey在喊话后,是可以直接粘到剪贴板上的。
因此,要彻底解决这个问题,恐怕修改剪贴板内存才是王道……
废话就先到这里,新手帖,希望各位高手指正…… |
|