Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl-在cp1251中复制到剪贴板_Perl_Clipboard_Cp1251 - Fatal编程技术网

Perl-在cp1251中复制到剪贴板

Perl-在cp1251中复制到剪贴板,perl,clipboard,cp1251,Perl,Clipboard,Cp1251,正在尝试将cp1251中的文本复制到剪贴板 #!/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); 任何Wi

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

#!/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”:

A bunch of cyrillic characters   à-á-â-ã 
我想我错过了一些特别简单的东西,但我被卡住了。有人能帮我吗?

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

这是有限的。例如,我的机器的ACP是有限的,因此我无法使用此模块将西里尔字母字符放在剪贴板上

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


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

使用utf8;
使用编码qw(Encode);
使用Win32 qw();
使用Win32::Clipboard qw();
#由于“使用utf8”,解码文本字符串又名Unicode代码点`
我的$text_ucp=“а-б-б-б-Γ\n”;
我的$acp=“cp”.Win32::GetACP();
my$clip=Win32::Clipboard();
$clip->Set(编码($acp,$text_ucp));

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

Perl希望源代码使用ASCII(
无utf8;
,默认值)或UTF-8(使用
无utf8;
)进行编码。但是,当
无utf8;
有效时(默认值),字符串和正则表达式文字是“8位干净的”,这意味着任何与ASCII字符不对应的字节将生成一个与该字节值相同的字符

使用Win32::Clipboard qw();
#使用源代码编码的文本(因为缺少“使用utf8”),
#它应该是活动代码页。
我的$text_acp=“а-б-б-а-Γ\n”;
my$clip=Win32::Clipboard();
$clip->Set($text\u acp);

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

以什么编码保存脚本?在cp1251中。当从记事本中使用Ctrl-C-Ctrl-V时,一切都正常工作。那么,为什么要告诉Perl从UTF-8转换?因为不转换它会放在剪贴板“а-б-б-б-б-Γ”改为“а-б-б-Γ”。我猜它会自动将脚本代码页转换为一些内部变量-我认为它应该是utf-8…如果不是(我已经看到-肯定不是)-我需要声明什么来代替“utf-8”“它确实存储在cp1251中-我通过打印到控制台检查了这一点,在cp866中工作:当我使用Encode::from_to($ConsoleOut,'cp1251','cp866')时,可以看到正确的文本;所以-问题似乎出在剪贴板输出中。也许还有其他方法可以将文本复制到剪贴板?我已经仔细检查了-Actibe代码页是cp1251(my$acp=“cp”.Win32::GetACP();print STDOUT$acp;在控制台上显示cp1251)。但是,当剪贴板内容粘贴到任何Windows位置时,这两个代码仍然给出“a-a-a-a-a-a-a-a-a-a-a-a”值(第一个代码段)或
printf(“%vX\n”,$text\u acp)(第二个代码段)并提供输出。请稍候,这些甚至不在cp1251代码页中。即使你做错了什么,那也是不可能的。尝试粘贴到
记事本
。在运行程序之前,将其他内容(如
abc
)放入剪贴板。将
abc
复制到剪贴板,粘贴到记事本-
abc
。然后使用控制台输出运行第二个代码段-get
E0.2D.E1.2D.E2.2D.E3.A
。粘贴到记事本-
á-ã
。据我所知,你告诉我的是不可能的。这只应该发生在cp1252系统上的cp1251文件上。这不会改变程序的工作方式。其他一些也不同。当你弄清楚你现在改变了什么相关的东西时,让我知道这个解决方案给了我我所需要的——剪贴板中所需的文本。如果我有足够的经验找到这样一个bug的来源,我在这里就不需要帮助了。对不起,但是你的“不可能”对我没有任何帮助,还有“负”……我不怀疑你有解决办法;我只是想让你知道是什么。如果你有兴趣找出问题所在