Длина строки в Perl не зависит от кодировки символов - PullRequest
4 голосов
/ 03 марта 2011

Функция длины предполагает, что китайские иероглифы состоят из более чем одного символа. Как определить длину строки в Perl независимо от кодировки символов (обрабатывать китайские символы как один символ)?

1 Ответ

8 голосов
/ 03 марта 2011

Функция length работает с символами, а не с октетами (байтами АКА).Определение символа зависит от кодировки.Китайские символы по-прежнему являются одиночными символами (если кодировка установлена ​​правильно!), Но они занимают более одного октета пространства.Таким образом, длина строки в Perl зависит от кодировки символов, в которой, по мнению Perl, находится строка;единственная длина строки, которая не зависит от кодировки символов, - это длина простого байта.

Убедитесь, что рассматриваемая строка помечена как UTF-8 и закодирована в UTF-8.Например, это дает 3:

$ perl -e 'print length("长")'

, тогда как это дает 1:

$ perl -e 'use utf8; print length("长")'

как:

$ perl -e 'use Encode; print length(Encode::decode("utf-8", "长"))'

Если вы получаете ваши китайские иероглифыиз файла убедитесь, что вы binmode $fh, ':utf8' файл перед чтением или записью его;если вы получаете данные из базы данных, убедитесь, что база данных возвращает строки в формате UTF-8 (или используйте Encode, чтобы сделать это для вас).

НадеюсьНе думаю, что у вас есть все в UTF-8, вам действительно нужно только убедиться, что строка помечена как имеющая правильную кодировку.Я бы пошел с UTF-8 спереди назад (и даже вбок), хотя это лингва франка для Unicode, и будет проще, если вы будете использовать его везде.

Возможно, вы захотите потратить некоторое время на чтениесправочную страницу perlunicode , если вы собираетесь работать с данными не-ASCII.

...