2013-04-05 28 views

Trả lời

19

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.

+0

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_)'? –

+1

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. –

+0

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! –

0

Chức năng strlnen không tính số ký tự, nhưng số byte. Đối với các ký tự nhiều byte, nó sẽ trả về số cao hơn. Thay vào đó, hãy sử dụng để đếm số ký tự thực tế.

0

Cũng giống như một phụ lục cho câu trả lời khác mà tham khảo mb_strlen():

Nếu php.in thiết mbstring.func_overload có chút 2 thiết lập để 1, sau đó strlen sẽ đếm ký tự dựa trên charset mặc định; nếu không nó sẽ đếm số lượng byte trong chuỗi

Các vấn đề liên quan