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
Đố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.
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.
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.
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
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.
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.
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
@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
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
html_entities (biến $, ENT_QUOTES); luôn luôn làm việc tốt cho tôi.
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
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
- 1. Lỗi trong chuỗi (multibyte không hợp lệ)
- 2. htmlspecialchars(): Chuỗi multibyte không hợp lệ trong đối số
- 3. Là htmlentities() bullet proof?
- 4. xuất chuỗi multibyte trong C++
- 5. của Ruby 1.9 - không hợp lệ multibyte char (US-ASCII)
- 6. htmlentities() so với htmlspecialchars()
- 7. MSBuild Build Sequence
- 8. C++ Contiguous Sequence Concept
- 9. Đệ quy trên Fibonacci Sequence
- 10. EclipseLink và Prencelocation Sequence Generator
- 11. Python - Memoization và Collatz Sequence
- 12. Htmlentities vs addslashes vs mysqli_real_escape_string
- 13. Truncate một String multibyte đến n chars
- 14. htmlentities và é (e cấp tính)
- 15. Ngữ nghĩa của Scala Traversable, Iterable, Sequence, Stream và View?
- 16. ASP.NET MVC View Engine Resolution Sequence
- 17. Symfony2: Auto htmlentities sử dụng cành
- 18. Rails 3 char multibyte không hợp lệ (US-ASCII)
- 19. Phát hiện ký tự Trung Quốc (multibyte) trong chuỗi
- 20. PHP htmlentities không hoạt động ngay cả với tham số
- 21. htmlentities() thực thể mã hóa kép trong chuỗi
- 22. utf-8 và htmlentities trong nguồn cấp dữ liệu RSS
- 23. Emacs, unicode, xterm mouse escape sequence, và terminal rộng
- 24. Tùy chọn giao dịch vùng chứa SSIS Sequence
- 25. ASN.1 SEQUENCE (OF) giá trị thẻ thực
- 26. @GeneratedValue (strategy = "IDENTITY") so với @GeneratedValue (strategy = "SEQUENCE")
- 27. JBoss EAP 6.x với Hibernate Oracle Sequence Giá trị trùng lặp trên khóa chính
- 28. Làm thế nào để loại bỏ htmlentities() giá trị từ cơ sở dữ liệu?
- 29. Có phải htmlentities() và mysql_real_escape_string() đủ để làm sạch đầu vào của người dùng trong PHP không?
- 30. PHP htmlentities không đủ để ngăn chặn tin tặc tiêm html từ biểu mẫu
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
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