如何在Perl中打印六十四卦?

3
我试图在Perl中打印这里的第一个六十四卦。
以下代码没有生成任何错误,但也没有打印任何卦象。
use warnings;
use open ':encoding(utf8)';
binmode(STDOUT, ":utf8");

print "\x{4DC0}\n";

我希望看到的是"䷀"而不是"Σ╖Ç"。

1
它对我有效。你确定你的终端是期望UTF-8吗? - Grinnz
use open 调用是不必要的,因为您在该范围内没有打开任何句柄。或者,如果您将 ':std' 作为参数添加到 use open 中,则不需要 binmode。无论哪种方式,您都应该传递 :encoding(UTF-8),因为 :utf8:encoding(utf8) 引用 Perl 的内部编码层,通常不应在代码中使用。 - Grinnz
是的,我改变了代码页,这有所帮助。现在我得到了一个小白色矩形,我想这是一种进步。你曾经尝试过在Tk画布对象中实现这个吗?这最初是为了达到那个目标而进行的测试。 - Douglas Marsh
并非所有字形都适用于所有字体。如果您在小部件上明确设置字体,则可能会更加顺利。 - Grant McLean
1个回答

4
你告诉 Perl 你的终端是 UTF-8 编码,但你的终端似乎期望以下之一:[1]

由于这些都是 Windows 代码页,我认为所涉及的终端是 Windows 控制台。如果是这样,可以使用以下任一命令查找期望的编码:

chcp

perl -le"use Win32; print Win32::GetACP()"

在数字前添加cp以获得可与Encode模块(由:encoding层使用)一起使用的名称。

然而,知道期望的编码并没有帮助。这些编码中的字符集都不包含“䷀”,因此您的终端无法显示“䷀”而不进行更改。

您可以通过发出以下命令将Windows控制台期望的编码切换为UTF-8:

chcp 65001

您可能需要在控制台属性中调整字体。


  1. I obtained the list of possible encodings using the following program:

    use strict;
    use warnings;
    use feature qw( say );
    use utf8;
    use Encode qw( decode encode_utf8 );
    
    my $output = encode_utf8("\x{4DC0}");
    my $displayed = "䷀";
    
    for my $encoding (Encode->encodings(":all")) {
       defined( my $got = eval { decode($encoding, $output, Encode::FB_CROAK|Encode::LEAVE_SRC) } )
          or next;
    
       say $encoding if $output eq $displayed;
    }
    

    (Make sure the file is encoded using UTF-8.)


你说得没错,这是一个Windows CMD窗口。我第一次尝试使用你的代码时出现了以下错误:PrintHexagram.pl第8行出现了格式不正确的UTF-8字符:\xc7\x22(在起始字节0xc7之后立即出现了意外的非连续字节0x22;需要2个字节,但只有1个字节)。 PrintHexagram.pl第8行出现了格式不正确的UTF-8字符(致命错误)。 - Douglas Marsh
  1. 我发布的代码对你没有用处。你应该继续使用你现有的代码。
  2. 你遇到那个错误是因为你没有按照指示使用UTF-8保存文件。
- ikegami
chcp 帮了一些人。 - Douglas Marsh
我必须弄清楚如何在我的编辑器中使用UTF-8。我知道它可以做到,但显然这是我第一次使用UTF-8的经验。 - Douglas Marsh
我发布的程序需要使用UTF-8保存,因为它包含非ASCII字符,这也是为什么使用use utf8;的原因。但这些对你来说都不重要。我只是为了以后参考而包含了这个程序。 - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接