Вопрос о поведении "utf-8" - PullRequest
3 голосов
/ 01 марта 2011
#!/usr/bin/env perl
use warnings;
use 5.012;
use Encode qw(encode);

no warnings qw(utf8);

my $c = "\x{ffff}";

my $utf_8 = encode( 'utf-8', $c );
my $utf8 = encode( 'utf8', $c );

say "utf-8 :  @{[ unpack '(B8)*', $utf_8 ]}";
say "utf8  :  @{[ unpack '(B8)*', $utf8 ]}";

# utf-8 :  11101111 10111111 10111101
# utf8  :  11101111 10111111 10111111

Кодирует ли «utf-8» таким образом, чтобы автоматически зафиксировать мою кодовую точку в последней взаимозаменяемой кодовой точке (первой плоскости)?

1 Ответ

7 голосов
/ 01 марта 2011

См. Раздел UTF-8 против UTF8 против UTF8 Кодирование документов.

Подводя итог, у Perl есть две разные кодировки UTF-8. Его собственное кодирование называется utf8 и в основном допускает любую кодовую точку, независимо от того, что стандарт Unicode говорит об этой кодовой точке.

Другая кодировка называется utf-8 (a.k.a. utf-8-strict). Это позволяет использовать только те кодовые точки, которые назначены стандартом Unicode.

\x{FFFF} не является допустимой кодовой точкой в ​​соответствии с Unicode. Но кодировка Perl utf8 не заботится об этом.

По умолчанию функция encode заменяет любой символ, который не существует в целевой кодировке, символом подстановки (см. Раздел Обработка искаженных данных *1020*). Для utf-8 этот символ замещения равен U + FFFD (ЗАМЕНЯЮЩИЙ ХАРАКТЕР) , который закодирован в UTF-8 как 11101111 10111111 10111101 (двоичный).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...