Функция 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.