2010-02-24 32 views
13

Trong khi cố gắng chạy một chuỗi thông qua hàm htmlentities của PHP, tôi có một số trường hợp mà tôi nhận được lỗi' Chuỗi Đa Chuỗi Không Hợp lệ '. Có cách nào để xóa chuỗi trước khi gọi hàm để ngăn lỗi này xảy ra không?Lỗi 'multibyte Sequence' của htmlentities '

Trả lời

8

Đối với PHP 5.3.0 trở xuống, bộ ký tự mặc định cho htmlentities() là ISO-8859-1. (Manual)

Có thể bạn đang áp dụng nó vào chuỗi UTF-8. Chỉ định bộ ký tự bằng cách sử dụng

htmlentities($string, (whatever), "UTF-8"); 

Kể từ PHP 5.4.0, bộ ký tự mặc định là UTF-8.

9

Tôi đã gặp phải các trường hợp không đủ để chỉ định UTF-8 và thấy tùy chọn ENT_IGNORE hữu ích. Tôi không nghĩ rằng đó là tài liệu cho htmlentities, chỉ cho htmlspecialchars nhưng nó không hoạt động trong ngột ngạt lỗi.

+2

Tôi biết đây là một chủ đề cũ nhưng tôi đi qua vấn đề này quá và nghĩ rằng nó có thể là đáng chú ý là việc sử dụng các ENT_IGNORE không được khuyến khích vì nó có thể có tác động an ninh: http://unicode.org/reports/tr36/#Deletion_of_Noncharacters – Dean

+0

Vâng, ENT_IGNORE là bản sửa lỗi duy nhất (/ hack) mà tôi đã tìm thấy cho vấn đề này, tại thời điểm này. – Kzqai

6

Nói chung các php ini thiết display_errors thể được sử dụng để kiểm soát dù lỗi là đầu ra cho trình duyệt, các log_errors thiết lập ini có thể được sử dụng độc lập để kiểm soát xem lỗi được ghi vào logfile, và nếu một tùy chỉnh xử lý lỗi đã được thiết lập với set_error_handler() thì điều này luôn được gọi cho tất cả các lỗi và có thể sau đó đọc các giá trị của display_errors và log_errors cùng với giá trị của error_reporting() và thực hiện hành động thích hợp, phải không?

Sai! Trong trường hợp này, htmlspecialchars() và htmlentities() chỉ kích hoạt lỗi nếu giá trị của display_errors là sai. Nếu giá trị của display_errors là đúng thì không có lỗi nào được kích hoạt! Hành vi dường như vô nghĩa này khiến không thể phát hiện các lỗi này trong quá trình gỡ lỗi với display_errors.

I got the information from here

+0

Cảm ơn bạn đã chỉ ra điều này - giải thích tại sao tôi chỉ thấy lỗi này khi sản xuất! Tôi không thể hiểu tại sao, trên hộp phát triển của tôi, nơi tất cả báo cáo lỗi được chuyển thành _ON_, tôi không thể tạo lại lỗi. – thaddeusmt

2

Bạn có sử dụng substr đâu đó trong chuỗi bạn muốn kiểm tra. Tôi đề nghị sau đó sử dụng mb_substr như một sự thay thế. Vấn đề là chất nền không phải là nhận biết unicode. Vì vậy, nó chỉ là cắt bỏ các byte trong bộ ký tự đa byte của bạn.

8

Tính đến PHP 5.4 bạn nên sử dụng một cái gì đó dọc theo sau để thoát ra đúng đầu ra:

$escapedString = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, $stringEncoding); 

ENT_SUBSTITUTE thay thế chuỗi đơn vị mã không hợp lệ bởi (thay vì trả lại một chuỗi rỗng).

ENT_DISALLOWED thay thế các điểm mã không hợp lệ trong loại tài liệu được chỉ định bằng .

ENT_HTML5 chỉ định loại tài liệu được sử dụng. Tùy thuộc vào những gì bạn đang sử dụng, bạn có thể chọn ENT_HTML401, ENT_XHTML hoặc ENT_XML1.

Sử dụng các tùy chọn đó, bạn đảm bảo rằng kết quả luôn hợp lệ trong loại tài liệu đã cho, bất kể loại dữ liệu bạn nhập có được.

Ngoài ra, đừng quên chỉ định $stringEncoding. Dựa vào mặc định là một ý tưởng tồi vì nó phụ thuộc vào các cài đặt ini và có thể (và đã làm) thay đổi giữa các phiên bản.

+0

Tài liệu PHP không rõ ràng về nó, nhưng 'ENT_HTML5' là thừa cho htmlspecialchars. Xem http://stackoverflow.com/a/14532168/427545 – Lekensteyn

+3

@Lekensteyn 'ENT_HTML5' không thừa, đặc biệt khi sử dụng' ENT_DISALLOWED'. Nó sẽ thay thế các điểm mã không hợp lệ trong tài liệu HTML5 bằng Ký tự thay thế Unicode. Ví dụ. xem ví dụ này: http://codepad.viper-7.com/q5bPMQ The 'ENT_HTML5 | ENT_DISALLOWED' đảm bảo rằng đầu ra không chứa bất kỳ điểm mã hóa không hợp lệ nào. – NikiC

+0

Cảm ơn bạn đã sửa, tôi đã mở rộng câu trả lời của mình để tính đến các ký tự không hợp lệ. Lúc đầu, tôi không biết sự khác biệt giữa DISALLOWED và SUBTITUTE, nhưng bây giờ nó đã trở nên rõ ràng với tôi. – Lekensteyn

-1

html_entities (biến $, ENT_QUOTES); luôn luôn làm việc tốt cho tôi.

+0

Mã hóa mặc định trong một số phiên bản của php là iso-something-something, và chỉ sau trong php 5.4 là nó utf-8. Lưu ý rằng bất kể, nó không nhất quán trên các phiên bản, vì vậy tốt nhất nên chỉ định mã hóa để khớp với bất kỳ mã hóa nào thực sự được sử dụng. – Kzqai

-2

Lưu ý rằng việc sử dụng utf-8 yêu cầu bật chức năng chuỗi nhiều byte. Điều này có nghĩa là thay thế các hàm như substr với mb_substr, ngoại trừ php cung cấp một thiết lập ini php để bật quá tải các hàm đó với mb tương đương.

Xem ở đây để biết thêm chi tiết: http://www.php.net/manual/en/mbstring.overload.php

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