在Perl/Gtk中显示CP437(扩展ASCII)

6

有没有办法在 Gtk2::TextView 中显示旧式扩展 ASCII(cp437)?(Google 没有提供答案。)

如果有改变 GTK 组件所用字符集的方法,我无法找到它。

或者可能需要使用 Perl 的 Encode 模块,就像我在下面的脚本中尝试的那样,但那也不起作用。

#!/usr/bin/perl
# Display ASCII

use strict;
use diagnostics;
use warnings;
use Encode;

use Glib qw(TRUE FALSE);
use Gtk2 '-init';

# Open a Gtk2 window, with a Gtk2::TextView to display text
my $window = Gtk2::Window->new('toplevel');
$window->set_title('Extended ASCII viewer');
$window->set_position('center');
$window->set_default_size(600, 400);
$window->signal_connect('delete-event' => sub {

    Gtk2->main_quit();
    exit;
});

my $scrollWin = Gtk2::ScrolledWindow->new(undef, undef);
$window->add($scrollWin);
$scrollWin->set_policy('automatic', 'automatic');     
$scrollWin->set_border_width(0);

my $textView = Gtk2::TextView->new;
$scrollWin->add_with_viewport($textView);
$textView->can_focus(FALSE);
$textView->set_wrap_mode('word-char');
$textView->set_justification('left');
my $buffer = $textView->get_buffer();

$window->show_all();   

# In cp437, this is a series of accented A characters
my $string = chr (131) . chr (132) . chr (133) . chr (134);

# Display plain text
$buffer->insert_with_tags_by_name($buffer->get_end_iter(), $string . "\n");

# Display UTF-8 text
my $utfString = encode('utf8', $string);
$buffer->insert_with_tags_by_name($buffer->get_end_iter(), $utfString . "\n");

# Display cp437
my $cpString = decode ('cp437', $string);
my $utfString2 = encode('utf-8', $cpString);
$buffer->insert_with_tags_by_name($buffer->get_end_iter(), $utfString2 . "\n");

# Other suggestion
my $otherString = encode("utf-8", decode ("cp437", $string));
$buffer->insert_with_tags_by_name($buffer->get_end_iter(), $otherString . "\n");

# Directly decode a hex character (as suggested)
my $hexString = encode("utf-8", decode("cp437", "\xBA"));
$buffer->insert_with_tags_by_name($buffer->get_end_iter(), $hexString . "\n");

Gtk2->main();

enter image description here


1
它为什么不工作?您可能需要[编辑]并包括输出的屏幕截图以及应该看起来像什么的描述。 - simbabque
如果 insert_with_tags_by_name 需要解码后的文本,请使用 my $string = decode("cp437", "\xBA"); - ikegami
如果“insert_with_tags_by_name”预期使用UTF-8编码的文本,请使用“my $string = encode(“UTF-8”,decode(“cp437”,“\xBA”));”。 - ikegami
我尝试过了,但没有成功。现在屏幕截图已经出现在上方。 - lesrol
我在Ubuntu 17.10上尝试了这个,使用Perl的Gtk2模块版本1.24992,结果和你一样。然而,如果我将编码改为latin1而不是utf-8,它就可以正常工作。我不确定这是否可能是Perl模块或Gtk中的一个错误。 - Håkon Hægland
显示剩余3条评论
2个回答

6

Gtk希望接收UTF-8编码的字符串,所以你传递给Gtk部件的任何内容都应该是UTF-8编码的。

如果你的输入是cp437,那么你需要先解码它,然后重新编码为UTF-8。

my $cp437_string = chr(153) x 10;               # cp437 encoded
my $string = decode('cp437', $cp437_string);    # Unicode code point encoded
my $utf8_string = encode('utf-8', $string);     # utf-8 encoded
$buffer->insert_with_tags_by_name(
    $buffer->get_end_iter(), $utf8_string . "\n");

也尝试过了,见上面编辑后的脚本和截图。 - lesrol

3

Gtk2.pm 期望使用 Perl 字符串(Encode::decode(...)),其内部存储为 UTF-8 编码。

如果你提供了一个字节字符串(Encode::encode(...)),它将尝试将其显示为 Latin1 编码。

# In cp437, this is a series of accented A characters
my $string = chr (131) . chr (132) . chr (133) . chr (134);

my $perlString = decode ('cp437', $string);

$buffer->insert_with_tags_by_name($buffer->get_end_iter(), $perlString . "\n\n");


my $charmap = join("", map chr, 128..255);
$charmap =~ s!.{16}\K!\n!g;
$perlString = decode ('cp437', $charmap);

$buffer->insert_with_tags_by_name($buffer->get_end_iter(), $perlString . "\n");

Gtk2->main();

生成的屏幕截图:

在此输入图片描述


谢谢您解决这个问题! - Håkon Hægland
谢谢!也适用于GTK3+。 - user3439968

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