首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl -在cp1251中复制到剪贴板

Perl -在cp1251中复制到剪贴板
EN

Stack Overflow用户
提问于 2020-08-10 19:52:00
回答 2查看 185关注 0票数 1

正在尝试复制到cp1251中的剪贴板文本。

代码语言:javascript
复制
#!/usr/bin/perl -w

use Clipboard;
use Encode;

    my $ClipboardOut = "A bunch of cyrillic characters - а-б-в-г \n";
    Encode::from_to($ClipboardOut, 'utf-8', 'cp1251');

    Clipboard->copy($ClipboardOut);

而不是西里尔字母"?“粘贴在任何Windows应用程序中。如果我删除带有Encode的行-西里尔字母会产生带有不同修饰符的"a'-s:

代码语言:javascript
复制
A bunch of cyrillic characters   à-á-â-ã 

我想我错过了一些特别简单的东西,但我被它卡住了。有没有人能帮帮我?

EN

回答 2

Stack Overflow用户

发布于 2020-08-11 04:21:03

在Windows中,Clipboard需要使用系统的活动代码页编码的文本。这是因为剪贴板只是Win32::Clipboard的一个包装器。虽然Win32::Clipboard允许您从剪贴板接收任意Unicode文本,但它不允许您在剪贴板上放置任意Unicode文本。因此,直接使用该模块不会有任何帮助。

这是有限制的。例如,我的机器的ACP是cp1252,所以我不能使用这个模块把西里尔字母放在剪贴板上。

假设您的系统的ACP支持有问题的西里尔字符,这里有两个解决方案:(我直接使用Win32::Clipboard,但您也可以以同样的方式使用Clipboard )。

使用UTF-8编码的源代码(这通常是理想的)

代码语言:javascript
复制
use utf8;

use Encode           qw( encode );
use Win32            qw( );
use Win32::Clipboard qw( );

# String of decoded text aka Unicode Code Points because of `use utf8;`
my $text_ucp = "а-б-в-г\n";

my $acp = "cp" . Win32::GetACP();
my $clip = Win32::Clipboard();
$clip->Set(encode($acp, $text_ucp));

根据活动代码页编码的源代码

Perl希望源代码使用ASCII码(no utf8;,默认值)或UTF8(带有use utf8;)进行编码。然而,当no utf8;生效(默认)时,字符串和正则表达式文本是“8位干净的”,这意味着任何不对应于ASCII码字符的字节都将产生一个与该字节具有相同值的字符。

代码语言:javascript
复制
use Win32::Clipboard qw( );

# Text encoded using source's encoding (because of lack of `use utf8`),
# which is expected to be the Active Code Page.
my $text_acp = "а-б-в-г\n";

my $clip = Win32::Clipboard();
$clip->Set($text_acp);
票数 2
EN

Stack Overflow用户

发布于 2020-08-12 01:17:21

找到临时解决方案:脚本用echo blah-blah-blah | clip生成.bat文件,运行后删除。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63339626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档