【问题标题】:Translate unicode code points to specific strings in irssi将 unicode 代码点转换为 irssi 中的特定字符串
【发布时间】:2017-04-20 12:54:30
【问题描述】:

是否有命令/设置/脚本将某些 unicode 代码点转换为 irssi 中的不同字符串?具体来说,我想将表情符号代码点转换为 ASCII 笑脸,因为我的字体不支持它们。这主要用于 facebook messenger 插件。我已经尝试为此创建一个 perl 脚本,但文档有些稀疏。

【问题讨论】:

  • 文档是什么?您必须创建一个映射。可能 CPAN 上已经有一个模块可以做类似的事情。从 ???? (U+1F604: SMILING FACE WITH OPEN MOUTH AND SMILING EYES) 到:D 应该相当简单。您使用哈希构建一个查找表。
  • perl 部分相对容易,虽然我不是真正的 perl 程序员。难的是irssi部分!我尝试创建一个可以转换所有传入消息的插件,但很难知道/看到我需要准确连接的位置。另外,不清楚字符串是什么格式的。
  • 实际上,我找到了一个很好的例子,但是实现一个 'no-op' 过滤器已经给我带来了问题:irssi 抱怨“critical query_find: assertion 'nick != NULL' failed”,所以可能成为我在某处触发的错误......

标签: perl unicode irssi


【解决方案1】:

所以,问题在于我的 irssi 有点过时了,这个错误已经修复,而且实际上很容易完成。对于任何想要做同样的事情的人,你需要一些类似的东西:

my %hash = (
    0x1f600 => ':)',
    # add smileys to taste here
);

sub transform ($$$$$$) {
    my ($server, $msg, $nick, $address, $target) = @_;
    my $transformed = '';

    $msg = decode('utf8', $msg);

    for (my $l = length($msg), my $i = 0; $i < $l; $i++) {
        my $chr = substr($msg, $i, 1);
        my $code = ord($chr);

        if (defined $hash{$code}) {
            $transformed .= $hash{$code};
        }
        else {
            $transformed .= $chr;
        }
    }
    Irssi::signal_continue($server, $transformed, $nick, $address, $target);
}

Irssi::signal_add_last('message public', 'transform');
Irssi::signal_add_last('message private', 'transform');

请注意,我绝对不是 Perl 专家,所以可能有更聪明/更好的方法来实现这一点!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 2019-06-13
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多