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