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