Как определить смайлики как 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}/'
-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 ";
}
}