mastermind 发表于 2013-1-2 16:18:11

[求助][思考]如何在剪贴板中写入utf8编码文本

本帖最后由 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在喊话后,是可以直接粘到剪贴板上的。

因此,要彻底解决这个问题,恐怕修改剪贴板内存才是王道……
废话就先到这里,新手帖,希望各位高手指正……

mastermind 发表于 2013-1-2 16:19:19

本帖最后由 mastermind 于 2013-1-2 16:28 编辑

转成gbk的乱码在编辑框能写,但是发不出来……还把后面都给我卡断了,所以在这里写吧……
“大家一起飞啊!”的utf8编码是e5 a4 a7(大) e5 ae b6(家) e4 b8 80(一) e8 b5 b7(起) e9 a3 9e(飞) e5 95 8a(啊) ef bc 81(!)
“大家一起忽悠啊!”的utf8码是e5 a4 a7(大) e5 ae b6(家) e4 b8 80(一) e8 b5 b7(起) e5 bf bd(忽) e6 82 a0(悠) e5 95 8a(啊) ef bc 81(!)

haijie1223 发表于 2013-1-3 07:43:47

很同情楼上,ClipPut应该没有问题,可能是dota不让你往喊话框中使用ctrl+v。

有没有试下ControlCommand或者postmessage?

mastermind 发表于 2013-1-3 12:32:21

回复 3# haijie1223

实际上编程只需要clipput一个事先准备好的乱码,send一个回车,再send(^v),再send一个回车就可以实现喊话,喊话框中使用ctrl+v没有问题。关键问题在于如何保证不丢字,这也是我讨论utf8码和写剪贴板内存的原因。

实际上别的工具,包括warkey,是不是用了ctrl+v我不敢说,但调用了剪贴板是毫无疑问的;如果仔细看这些编好的软件的工作过程,也是先呼出喊话框,然后瞬间喊话框中多出一句话,然后就发出去了;联系到剪贴板中还留着内容,这种实现方式看来是最常用的。
页: [1]
查看完整版本: [求助][思考]如何在剪贴板中写入utf8编码文本