Trang perldoc
cho length() cho tôi biết rằng tôi nên sử dụng bytes::length(EXPR)
để tìm chuỗi Unicode theo byte hoặc trang bytes lặp lại điều này.Làm cách nào để tìm độ dài của chuỗi Unicode trong Perl?
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";
Kết quả của kịch bản này, tuy nhiên, không đồng ý với manpage:
ASCII: 26
ASCII bytes: 26
Unicode: 35
Unicode bytes: 35
Dường như với tôi chiều dài() và byte :: length() trả lại tương tự cho cả hai ASCII & chuỗi Unicode . Tôi có biên tập viên của tôi thiết lập để ghi các tập tin như UTF-8 theo mặc định, vì vậy tôi hình Perl là giải thích toàn bộ kịch bản như Unicode-không có nghĩa là chiều dài() tự động xử lý chuỗi Unicode đúng cách?
Chỉnh sửa: Xem nhận xét của tôi; câu hỏi của tôi không có ý nghĩa gì cả, bởi vì length() là không phải hoạt động "đúng" trong ví dụ trên - nó hiển thị độ dài của chuỗi Unicode theo byte, không phải ký tự. Các reson tôi ban đầu vấp qua này là cho một chương trình mà tôi cần phải đặt tiêu đề Content-Lenth (theo byte) trong một tin nhắn HTTP. Tôi đã đọc trên Unicode trong Perl và mong đợi phải làm một số fanciness để làm cho mọi thứ hoạt động, nhưng khi length() trả về chính xác những gì tôi cần ngay lập tức của con dơi, tôi đã nhầm lẫn! Xem câu trả lời được chấp nhận để biết tổng quan về use utf8
, use bytes
và no bytes
trong Perl.
Tôi không thấy lý do tại sao bạn nói rằng độ dài() xử lý các chuỗi unicode đúng cách. Trong chiều dài ví dụ của bạn() cho kết quả tương tự như byte :: length(), đó là số byte, không phải số ký tự (mà sẽ là thích hợp). – Inshallah
Nói cách khác, độ dài ($ unicode) diễn giải chuỗi như ASCII, không phải là unicode. – Inshallah
Bạn hoàn toàn chính xác! Tôi đã hoàn toàn bỏ qua thực tế này - trong chương trình của tôi, tôi đang sử dụng length() để đặt tiêu đề Content-Length trong một thông báo HTTP, cần phải theo byte. Sau khi đọc các tài liệu length(), tôi đã mong đợi hàm đó trả về một cái gì đó không chính xác, nhưng thực ra chính xác những gì tôi muốn khi Perl đang ở chế độ 'use bytes': độ dài của chuỗi Unicode theo byte, chứ không phải là ký tự. –