2013-07-30 14 views
5

Mô-đun mbstring PHP có cài đặt strict_detection, documented here. Thật không may, hướng dẫn sử dụng là hoàn toàn vô dụng; nó chỉ nói rằng tùy chọn này "cho phép phát hiện mã hóa nghiêm ngặt".mbstring.strict_detection làm gì?

Tôi đã thực hiện một vài thử nghiệm và không thể tìm thấy bất kỳ chức năng mbstring nào bị ảnh hưởng bởi điều này. mb_check_encoding()mb_detect_encoding() cho kết quả chính xác cho cả đầu vào UTF-8 hợp lệ và không hợp lệ.

(chỉnh sửa :) Tùy chọn mbstring.strict_detection đã được thêm vào trong PHP 5.1.2.

Trả lời

5

Nếu không có thông số nghiêm ngặt được đặt, phát hiện mã hóa nhanh hơn nhưng sẽ không chính xác. Ví dụ, nếu bạn đã có một chuỗi UTF-8 với phần chuỗi UTF-8 như thế này:

$s = "H\xC3\xA9ll\xC3"; 
$encoding = mb_detect_encoding($s, mb_detect_order(), false); 

Kết quả của mb_detect_encoding cuộc gọi vẫn sẽ là "UTF-8" mặc dù nó không có giá trị UTF-8 (ký tự cuối cùng chưa hoàn thành).

Nhưng nếu bạn thiết lập các thông số nghiêm ngặt true ...

$s = "H\xC3\xA9ll\xC3"; 
$encoding = mb_detect_encoding($s, mb_detect_order(), true); 

Nó sẽ thực hiện một kiểm tra kỹ lưỡng hơn, và kết quả của cuộc gọi đó sẽ là FALSE.

+0

Đúng vậy, nhưng cài đặt của 'mbstring.strict_detection' không ảnh hưởng đến hành vi đó (thậm chí không phải giá trị mặc định của tham số $ strict). – Zilk

+0

Nó hoạt động cho tôi. Với 'mbstring.strict_detection = On', giá trị mặc định cho tham số * strict * là đúng. Lưu ý rằng điều này chỉ có sẵn kể từ PHP 5.1.2. –

+0

Ah, bạn nói đúng, nó * có * ảnh hưởng đến 'mb_detect_encoding()' nếu tham số thứ ba bị thiếu. Tôi đã gặp lỗi trong các bài kiểm tra của mình; chỉ 'mb_check_encoding()' và 'mb_convert_encoding()' không bị ảnh hưởng. Cảm ơn bạn. – Zilk