Страница perldoc
для length() говорит мне, что я должен использовать bytes::length(EXPR)
для поиска строки Unicode в байтах или страница 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";
Выход этого script, однако, не согласуется с man-страницей:
ASCII: 26
ASCII bytes: 26
Unicode: 35
Unicode bytes: 35
Мне кажется, length() и bytes:: length() возвращают то же самое для строк ASCII и Unicode. У меня есть мой редактор для записи файлов как UTF-8 по умолчанию, поэтому я считаю, что Perl интерпретирует весь script как Unicode - означает ли это, что length() автоматически обрабатывает строки Unicode правильно?
Изменить: См. мой комментарий; мой вопрос не имеет большого смысла, потому что length() не работает "правильно" в приведенном выше примере - он показывает длину строки Unicode в байтах, а не в символах. Резонанс, который я первоначально наткнулся на это, - это программа, в которой мне нужно установить заголовок Content-Lenth (в байтах) в сообщении HTTP. Я прочитал в Unicode в Perl и ожидал, что вам нужно будет сделать какое-то причудливое отношение, чтобы заставить все работать, но когда length() вернул именно то, что мне нужно было прямо с места в карьер, я был в замешательстве! См. Принятый ответ для обзора use utf8
, use bytes
и no bytes
в Perl.