【问题标题】:How do I make Perl's Clipboard module write utf-8 correctly to the clipboard?如何让 Perl 的剪贴板模块将 utf-8 正确写入剪贴板?
【发布时间】:2021-02-12 05:17:07
【问题描述】:

运行此脚本 (OSX 10.14):

use utf8;
use Clipboard;

$mystring = "Willkommen, bienvenue, أهلا, שלום, welcome";

Clipboard->copy($mystring);

将以下字符串放入剪贴板:

Willkommen, bienvenue, أهلا, שלום, welcome

什么魔法可以使它正确?

顺便说一句,Clipboard->paste() 在上面的片段之后立即正确地恢复了我的原始字符串。作为一种解决方法,我正在使用这个:

    open(CLIPBOARD, "|pbcopy");
    print CLIPBOARD $mystring;
    close(CLIPBOARD);

。 . .效果很好,但当然很笨拙,每次都会创建一个额外的过程。

【问题讨论】:

  • 您的完整 perl 代码是否包含 use utf8;
  • 你使用的是什么操作系统?
  • @Shawn 编辑了原文以回答这些问题(使用“是”和“OSX 10.14”)。有没有“use utf8”没有区别。
  • 新版本对我来说适用于 linux(没有use utf8)。没有要测试的 mac。

标签: perl utf-8


【解决方案1】:

在 Mac OS 上,Clipboard 使用 Clipboard::MacPasteboard 执行复制操作。后一个模块使用Mac::Pasteboard。此模块使用以下代码(请参阅line 167),至少在我的 macOS 10.15.5 机器上:

open my $fh, '|-', 'pbcopy' or croak "Unable to open pipe to pbcopy: $!";
print { $fh } $data;
close $fh; 

将字符串复制到剪贴板。但是文件句柄 $fh 没有启用 UTF-8 层。如果我添加:

binmode $fh, 'encoding(utf-8)';

print 语句之前,它在这里工作正常。在 macOS Catalina 10.15.5 上测试。

由于Clipboard 只是调用Mac::Pasteboard,而后者有更多的选项来编码剪贴板的内容,我建议你尝试Mac::Pasteboard

【讨论】:

  • 非常感谢。后续问题:看起来底层代码只是管道到一个新的 pbcopy 进程!是这样吗?我认为使用 Perl 模块可以避免为每个副本创建一个新进程。如果不是这样,我不知道我为什么要打扰。
  • “看起来底层代码只是管道到一个新的 pbcopy 进程”:根据documentation“macOS 10.15 Catalina 似乎已经坏了这个模块。问题似乎是在粘贴板上放置文本。作为权宜之计,直到我可以正确地解决这个问题,如果在 Darwin 19 或更高版本下运行,copy() 方法会生成 pbcopy (1)。" 所以我认为它只为 10.15 或更高版本调用 pbcopy。由于您使用的是 10.14,因此不应使用 pbcopy
  • 太棒了。你碰巧知道如何设置我需要的选项吗?我尝试使用$pb->set(encode=>1),但没有奏效。
  • 因为我使用的是 10.15,所以一切正常,无需为我设置编码。我可以做$pb->copy($str); 并且它有效。您是否尝试使用pbencode("public.utf8-plain-text"); 设置编码?
  • 我做到了,但这也不起作用,也没有任何我可以直觉到 pbencode 的论点。叹。我想我会继续努力。
猜你喜欢
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多