Как определить смайлики как Unicode в Perl?

У меня есть текстовый файл, который содержит эмодзи символ Unicode для примера, ☹️,,,,,, .

Например, код \N{1F60D} соответствует рекомендациям, которые я использую, как в разделе https://perldoc.perl.org/perluniintro.html Создание Unicode. Моя программа должна обнаружить их и сделать некоторые процедуры, но если я использую

open(FIC1, ">$fic");

while (<FIC>) {
my $ligne=$_;

if( $ligne=~/\N{1F60D}/  )
{print "heart ";
    }
}

Теперь я делаю это, это работает

open(FIC1, ">$fic");

while (<FIC>) {
my $ligne=$_;

if( $ligne=~//  )
{print "Heart ";
    }
}

В чем проблема с первым кодом С уважением

3 ответа

Решение

Если вы посмотрите на Perldoc Perlre для \NВы видите, что это означает "именованный символ Unicode или последовательность символов".

Вы можете использовать это вместо:

if ($ligne =~ m/\N{U+1F60D}/)
# or
if ($ligne =~ m/\x{1F60D}/)

Изменить: это также описано в ссылке, которую вы разместили, https://perldoc.perl.org/perluniintro.html

Изменить: Содержание, которое вы читаете, вероятно, не декодируется. Ты хочешь:

use Encode;
...
my $ligne = decode_utf8 $_;

или просто откройте файл непосредственно в режиме utf8:

open my $fh, "<:encoding(UTF-8)", $filename or die "Could not open $filename: $!";
while (my $ligne = <$fh>) {
    if ($ligne =~ m/\N{U+1F60D}/) { ... }
}

Вы никогда не показывали, как вы открываете дескриптор файла FIC, поэтому я предположил, что это был UTF8 расшифрован. Вот еще один хороший учебник о Unicode в Perl: https://perlgeek.de/en/article/encodings-and-unicode

Для обнаружения смайликов я бы использовал свойства юникода в регулярных выражениях, например:

  • \p{Emoticons} или же
  • \p{Block: Emoticons}

Например, распечатать только смайлики

perl -CSDA -nlE 'say for( /(\p{Emoticons})/g )' <<< 'abcαβγ'

распечатает




Для получения дополнительной информации см Perluniprops

Использование perl -C может использоваться для включения функций Unicode

perl -C -E 'say "\N{U+263a}"'|perl -C -ne 'print if /\N{U+263a}/'

из Perl Run

-C [номер / список]

Флаг -C управляет некоторыми функциями Perl Unicode....

Причина, по которой работает второй код, состоит в том, что perl соответствует двоичной последовательности UTF-8: как в perl -ne 'print if /\xf0\x9f\x98\x8d/',

Следующее должно работать

#!/usr/bin/perl -C
open(FIC1, ">$fic");

while (<FIC>) {
    my $ligne=$_;

    if( $ligne=~/\N{U+1F60D}/  ) {
        print "heart ";
    }
}
Другие вопросы по тегам