免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10412 | 回复: 5

[已解决]Win32::Clipboard复制中文字符到剪切板乱码 [复制链接]

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-03-24 20:32 |显示全部楼层
本帖最后由 523066680 于 2014-03-25 01:22 编辑
  1. use Win32::Clipboard;
  2. use Encode;

  3. my $str="\xd6\xd0"; # "中" GBK
  4. my $cp=Win32::Clipboard->new();
  5. $cp->Set($str);
复制代码
粘贴显示结果:ÖÐ

但是如果再次从剪切板中获取,却又能得到正确的结果:
  1. my $val=$cp->Get();
  2. print $val;
复制代码
如果我对\xd6\xd0 解码为Unicode再送入剪切板,剪切板粘贴出来则是另一堆乱码。
于是没有了头绪。

我已经知道的是,ÖÐ相当于对GBK的"中"直接进行UTF-8编码产生的结果(这显然一个错误的操作)
open WRT,">:raw","err.txt";
print WRT encode('utf-8',"\xd6\xd0");
close WRT


论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-03-24 21:40 |显示全部楼层
本帖最后由 523066680 于 2014-03-24 21:50 编辑

此刻我真的有些厌烦Perl的某些模块,搞什么搞?有GetAs却没有SetAs?
http://www.perlmonks.org/?node_id=902266
If my reading of Clipboard.xs in the Win32::Clipboard source is correct, then the module does *not* have any way to make Set() work as anything but CF_TEXT. The docs even explicitly say about CF_TEXT:

    this is the only format you can use to set clipboard data

Options:

    Submit a request via rt.cpan.org to add this functionality.
    Edit the source to make a SetAs() routine, by combining techniques from GetAs() and Set(). Don't forget to send a patch to Jan Dubois.
    Use Win32::API to directly access SetClipboardData(CF_UNICODETEXT, Data) and related APIs.
    Pay someone to do #2 or #3.

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2014-03-24 22:26 |显示全部楼层
是你粘贴到的地方不支持中文字体吧,firefox notepad gvim 什么的都是正常的

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-03-24 23:08 |显示全部楼层
本帖最后由 523066680 于 2014-03-24 23:21 编辑

回复 3# zhlong8

不知道不同的版本会不会有影响。我在WINXP下 火狐、notepad 都试过了。
This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x86-multi-thread

我有证明的:

ÖÐ的UTF-8编码是:
c3 96 c3 90
对其按照UTF-8解码并逐字节显示

xcode(decode('utf8',"\xc3\x96\xc3\x90"),'x');

sub xcode {
    # xcode("string",'Mode'); Mode = x(hex), b(bin), d(int)
    for my $v ( split(//,$_[0]) ) {
        print sprintf ("%l$_[1] ",ord($v));
    }
    print "\n\n";
}

显示结果:
d6 d0
这恰好是“中”的GBK码。说明D6 D0 被当做Unicode进行了Encode("UTF-8",....)这样的操作。
中间却没有先转换为Unicode,这是显示乱码的原因。

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-03-25 01:21 |显示全部楼层
本帖最后由 523066680 于 2014-03-25 01:24 编辑

回复 3# zhlong8


问题解决了!解决方法真特别啊!
http://www.fandecheng.com/archives/539

它的原因不是控制面板里区域选项的语言选择,也不是“非 Unicode 程序的默认编码”,因为这些都是设成中文(中国)的。问题居然出在输入法:EN 的输入法。要避免把 EN 输入法作为默认,而使用中文的 CN 输入法或是其他中文输入法作为默认。这样一来就解决问题了!


其他参考链接

http://bbs.csdn.net/topics/80362400
会这样的原因是当复制到剪贴板的时候那个程序使用的不是中文输入法,那么复制的时候就会以英文(一般情况下)编码,再复制回来的时候,内码已经变了,自然成了乱码。



http://bbs.csdn.net/topics/350104899
  1. win7 复制粘贴的时候出现文字乱码

  2. 导致该问题的原因是输入法设置不当。Windows 7默认的输入法为英语,键盘模式为美式键盘,同时提供的还有中文键盘的模式,由于使用英文美式键盘没有任何问题,所以大家在设置的时候,也就习惯性的把中文键盘删除,只保留英文键盘。就是因为这个原因才导致复制时出现乱码的问题。

  3. 解决的办法是删除英文的美式键盘模式,添加中文键盘模式并且设置为默认值。

  4. 具体操作步骤是:在系统桌面任务栏上的语言栏单击鼠标右键,在弹出的菜单中选择“设置”命令,进入到“文字服务和输入语言”对话框,切换至“设置”选项卡,在“已安装的服务”列表中找到键盘模式为美国英语键盘布局的英语输入法,将其删除,然后将默认的输入语言设定为“中文(中国)-简体中文-美式键盘”,最后保存退出即可。若不能解决问题,建议您在剪切和粘贴时都启动中文输入法,这样也可以消除乱码现象。
复制代码

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-08-12 22:39 |显示全部楼层
本帖最后由 523066680 于 2014-08-15 23:43 编辑

………………
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP