У меня есть некоторые интересные результаты, пытаясь различить различия между использованием 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 сначала считает байты перед декодированием (как и ожидалось), затем считает символы после первого декодирования, но затем снова считает байты после второго декодирования (не ожидается). Почему произошло это переключение? Есть ли какое-то упущение в моем понимании того, как работают эти функции декодирования?
Спасибо,
Мэтт