strlen()
không xử lý đúng các ký tự nhiều byte, vì nó giả định 1 char bằng 1 byte, đơn giản là không hợp lệ đối với unicode. Hành vi này được ghi chép lại ở đây: http://php.net/strlen
strlen() trả về số byte chứ không phải là số lượng ký tự trong một chuỗi.
Giải pháp là sử dụng mb_strlen()
chức năng thay vì (mb
đứng cho multi byte
) (see mb_strlen() docs).
EDIT
Nếu vì bất kỳ sự thay đổi lý do trong mã là không thể/doable, người ta có thể muốn đảm bảo chức năng chuỗi sẽ được tự động quá tải bởi đối tác đa byte. Điều này được hỗ trợ bởi PHP và documented here.
Xin lưu ý rằng bạn cũng có thể muốn chỉnh sửa php.ini
của mình để đảm bảo mb_string hoạt động như bạn muốn. Các cài đặt có sẵn là documented here.
Nguồn
2013-04-05 08:51:25
Tôi tự hỏi, điểm cụ thể để tách các hàm unicode/non-unicode là gì? Tại sao không phải lúc nào cũng sử dụng các hàm '(mb_)'? –
Một thời gian ngắn - đó là vì thiết kế PHP (như ngôn ngữ) hút ở nhiều nơi và điều này cũng bao gồm hỗ trợ UTF8. PHP đã không hỗ trợ mã hóa nhiều byte trong nội bộ cho các độ tuổi, và đó là lý do tại sao phần mở rộng multibyte được tạo ra. Bạn có thể có 'mb_' được sử dụng tự động bởi PHP bằng cách sử dụng hàm overloading -> xem http://php.net/manual/en/mbstring.overload.php nhưng điều đó phụ thuộc vào cấu hình PHP vì vậy đôi khi có thể tốt hơn để sử dụng trực tiếp' mb_ 'nếu bạn không thể đảm bảo nó sẽ được sử dụng theo cách khác. –
Cảm ơn bạn đã giải thích, bạn của tôi, và đặc biệt là khi chỉ vào 'overload', bỏ lỡ điều đó hoàn toàn .. Chúc mừng! –