Board logo

标题: [原创教程] [Perl]解决英文输入法状态下-访问剪切板汉字乱码问题 [打印本页]

作者: 523066680    时间: 2014-8-15 22:52     标题: [Perl]解决英文输入法状态下-访问剪切板汉字乱码问题

本帖最后由 523066680 于 2014-8-15 23:18 编辑

环境: ActivePerl v5.16.3 built for MSWin32-x86

首先附上小函数,用来显示字符串的字节值

──────────────────────┐
sub xcode {                                 │
    $_[1]='x' if (not defined $_[1]);       │
    for my $v ( split(//,$_[0]) ) {         │
        print sprintf ("%l$_[1] ",ord($v)); │
    }                                       │
    print "\n\n";                           │
}                                           │
──────────────────────┘


之前对Win32::Clipboard 模块函数了解有限,一直使用GetText() 获取文本信息,
其作用和GetAs(CF_TEXT) 效果一致,当输入法设置为EN并且拷贝汉字:"中文"
(GBK: d6 d0, ce c4) (UTF-16LE: 2d 4e, 87 65) 的时候
────────────────┐
$test = $clip->GetText(CF_TEXT);│
print "GET_TEXT: $test";        │
xcode($test);                   │
────────────────┘

显示结果为:GET_TEXT: ??3f 3f
(问号的ASCII值就是0x3f) 为什么变成问号我不知道。不过今天我发现GetAs(
CF_UNICODETEXT); 无论在输入法设为EN 还是CH的状态下拷贝汉字,都能取得
UTF-16LE编码流的字符串,而不是变成3f。
───────────────────┐
$test = $clip->GetAs(CF_UNICODETEXT); │
print "UNICODETEXT: $test";           │
xcode($test);                         │
───────────────────┘

输出:UNICODETEXT: -N噀2d 4e 87 65

  于是我就不需要在以后有关剪切板的脚本中考虑系统输入法的问题了(完全是
因为认知有限。。。)只需要对获取的字符串按UTF-16LE 解码再编码为GBK即可
正常处理。

于是这样就可以正确地获取剪切板中的汉字而不需要考虑输入法了
────────────────────────┐
use Encode;                                     │
use Win32::Clipboard;                           │
                                                │
#获取中文信息                                   │
my $clip;                                       │
my $test;                                       │
$clip = Win32::Clipboard();                     │
$test = $clip->GetAs(CF_UNICODETEXT);           │
print encode('gbk', decode('UTF-16LE', $test)); │
────────────────────────┘


以下摘自 perldoc Win32::Clipboard:
───────────────────────────────────┐
   If CF_UNICODETEXT is used, then binary Unicode data is returned. A │
   perl unicode string can be generated as follows:                   │
                                                                      │
       $text = $clip->GetAs(CF_UNICODETEXT);                          │
       $text = Encode::decode("UTF16-LE", $text);                     │
───────────────────────────────────┘


总结:
───────────────────────────┐
──────────────────────────┐│
Win32::Clipboard其实很好用,问题在于我个人使用不当。││
──────────────────────────┘│
───────────────────────────┘

作者: 523066680    时间: 2014-8-15 23:15

本帖最后由 523066680 于 2014-8-15 23:51 编辑

这排版略蛋疼……   小代码就不[code]了

我发现自己以前的帖子,还有个蛋疼的写入剪切板乱码问题,
知识有限, 暂时把输入法设置为默认中文了。
参考
Win32::Clipboard复制中文字符到剪切板乱码
http://bbs.chinaunix.net/thread-4132710-1-1.html




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2