Удалить спецификацию из строки с помощью Perl
У меня следующая проблема: я читаю из текстового файла UTF-8 (и я говорю Perl, что я делаю это с помощью ":encoding(utf-8)").
Файл выглядит так в шестнадцатеричной программе просмотра: EF BB BF 43 6F 6E 66 65 72 65 6E 63 65
Это переводится как "Конференция" при печати. Я понимаю "широкий характер", о котором меня предупреждают, это спецификация. Я хочу избавиться от этого (не из-за предупреждения, а потому, что оно испортило сравнение строк, которое я предприму позже).
Поэтому я попытался удалить его, используя следующий код, но у меня ничего не получилось:
$ line = ~ s / ^ \ xEF \ xBB \ xBF //;
Может ли кто-нибудь объяснить мне, как удалить спецификацию UTF-8 из строки, которую я получил, прочитав первую строку файла UTF-8?
Спасибо!
4 ответа
EF BB BF
является кодировкой UTF-8 спецификации, но вы ее расшифровали, поэтому вы должны искать ее декодированную форму. Спецификация - это НУЛЕВОЙ ПРОБЕЛ с НУЛЕВОЙ ШИРИНОЙ (U+FEFF), используемый в начале файла, поэтому подойдет любое из следующего:
s/^\x{FEFF}//;
s/^\N{U+FEFF}//;
s/^\N{ZERO WIDTH NO-BREAK SPACE}//;
s/^\N{BOM}//; # Convenient alias
Я понимаю "широкий характер", о котором меня предупреждают, это спецификация. Я хочу избавиться от этого
Вы получаете широкий характер, потому что вы забыли добавить :encoding
слой на вашем дескрипторе выходного файла. Следующие добавляет :encoding(UTF-8)
STDIN, STDOUT, STDERR, и делает его по умолчанию для open()
,
use open ':std', ':encoding(UTF-8)';
Чтобы разрядить спецификацию, вы должны знать, что это не 3 символа, а 1 в UTF (U+FEFF):
s/^\x{FEFF}//;
Если вы откроете файл, используя File:: BOM, он удалит BOM для вас.
use File::BOM;
open_bom(my $fh, $path, ':utf8')
В идеале, ваш файловый дескриптор должен делать это автоматически. Но если вы не в идеальной ситуации, это сработало для меня:
use Encode;
my $value = decode('UTF-8', $originalvalue);
$value =~ s/\N{U+FEFF}//;