Удалить спецификацию из строки с помощью 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?

Спасибо!

Ответ 1

EF BB BF - это кодировка UTF-8 спецификации, но вы ее декодировали, поэтому вы должны искать ее декодированную форму. Спецификация представляет собой ZERO WIDTH NO-BREAK SPACE (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)';

Ответ 2

Чтобы разрядить спецификацию, вы должны знать это не 3 символа, а 1 в UTF (U + FEFF):

s/^\x{FEFF}//;

Ответ 3

Если вы откроете файл, используя File:: BOM, он удалит вам спецификацию.

use File::BOM;

open_bom(my $fh, $path, ':utf8')

Ответ 4

В идеале, ваш дескриптор файла должен делать это автоматически. Но если вы не в идеальной ситуации, это сработало для меня:

use Encode;

my $value = decode('UTF-8', $originalvalue);
$value =~ s/\N{U+FEFF}//;