Страница perldoc
для length () говорит мне, что я должен использовать bytes::length(EXPR)
, чтобы найти строку Unicode в байтах, или страница 10000 * bytes повторяет это.
use bytes;
$ascii = 'Lorem ipsum dolor sit amet';
$unicode = 'Lørëm ípsüm dölör sît åmét';
print "ASCII: " . length($ascii) . "\n";
print "ASCII bytes: " . bytes::length($ascii) . "\n";
print "Unicode: " . length($unicode) . "\n";
print "Unicode bytes: " . bytes::length($unicode) . "\n";
Вывод этого скрипта, однако, не согласуется с man-страницей:
ASCII: 26
ASCII bytes: 26
Unicode: 35
Unicode bytes: 35
Мне кажется, что length () и bytes :: length () возвращают одинаковые строки ASCII и Unicode. Мой редактор по умолчанию настроен на запись файлов в формате UTF-8, поэтому я считаю, что Perl интерпретирует весь сценарий как Unicode - значит ли это, что length () автоматически обрабатывает строки Unicode правильно?
Редактировать: Смотрите мой комментарий; Мой вопрос не имеет большого смысла, потому что length () не работает "правильно" в приведенном выше примере - он показывает длину строки Unicode в байтах, а не в символах. Резонанс, который я наткнулся на это, касается программы, в которой мне нужно установить заголовок Content-Lenth (в байтах) в HTTP-сообщении. Я читал об Unicode в Perl и ожидал, что мне придется что-то придумать, чтобы все заработало, но когда length () вернул именно то, что мне было нужно, я был в замешательстве! См. Принятый ответ для обзора use utf8
, use bytes
и no bytes
в Perl.