Perl: utf8 :: decode против Encode :: decode

У меня есть некоторые интересные результаты, пытаясь различить различия между использованием Encode :: decode ("utf8", $ var) и ] utf8 :: decode ($ var) . Я уже обнаружил, что вызов первого несколько раз для переменной в конечном итоге приведет к ошибке «Невозможно декодировать строку с широкими символами в ...», тогда как последний метод будет успешно выполняться столько раз, сколько вы хотите, просто возвращая false.

У меня проблемы с пониманием того, как функция length возвращает разные результаты в зависимости от того, какой метод вы используете для декодирования. Проблема возникает из-за того, что я имею дело с "дважды закодированным" текстом utf8 из внешнего файла. Чтобы продемонстрировать эту проблему, я создал текстовый файл "test. decode взял 4 кодовых точки и интерпретировал их как байты в кодировке utf8, в результате получилось 2 символа. Странно то, что когда я изменяю код для вызова utf8 :: decode (заменяю все $ test = Encode :: decode ("utf8", $ test); на utf8 :: decode ($ test))

Это дает практически идентичный вывод, отличается только результат длины:

Length: 7
utf8 flag: 
Unicode:
195 168 194 171 194 139 10
Hex:
c3a8c2abc28b0a
==============
Length: 4
utf8 flag: 1
Unicode:
232 171 139 10
Hex:
c3a8c2abc28b0a
==============
Length: 4
utf8 flag: 1
Unicode:
35531 10
Hex:
e8ab8b0a

Кажется, что perl сначала считает байты перед декодированием (как и ожидалось), затем считает символы после первого декодирования, но затем снова считает байты после второго декодирования (не ожидается). Почему произошло это переключение? Есть ли какое-то упущение в моем понимании того, как работают эти функции декодирования?

Спасибо,
Мэтт

7
задан Matt 2 December 2010 в 20:12
поделиться