2012-06-26 14 views
5

Sử dụng cả htmlspecialchars và htmlentities sẽ gây ra kết quả đầu ra trống từ các mục như biểu tượng và thậm chí là một dấu ngoặc đơn '. Rõ ràng, điều này là hoàn toàn vô dụng, tuy nhiên xuất các dữ liệu mà không sử dụng các ký tự html kết quả trong biểu tượng này cho cả hai . Bất kỳ lý do tại sao điều này xảy ra?htmlspecialchars xuất trống

đây là mã mà gây ra vấn đề:

<p> 
<?php 
    echo nl2br(htmlspecialchars($aboutarray[0]['about_us'], ENT_COMPAT, "UTF-8")); 
?> 
</p> 
+2

Nghe giống như vấn đề bộ ký tự. Bạn có chắc chắn dữ liệu của mình được mã hóa UTF-8 không? –

+0

Tôi có thể hiểu sai vấn đề của bạn, nhưng tôi đã thử điều này trên ideone.com và có vẻ như hoạt động tốt: http://ideone.com/P298n –

+0

@ EmilVikström Làm cách nào để tôi đảm bảo điều này? – JimmyBanks

Trả lời

13

chuỗi Đó không phải là mã hóa trong mã hóa hợp lệ UTF-8. Nó có thể được mã hóa khác như UTF-16 hoặc có lẽ nó chỉ chứa một số rác nhị phân không tương ứng với bất kỳ định dạng nào. Nếu bạn chỉ định "UTF-8" làm thông số kiểu mã hóa của htmlspecialchars(), nó sẽ trả về một chuỗi rỗng nếu chuỗi không tuân thủ "UTF-8". Nó tuyên bố điều này trong PHP manual.

Sửa lỗi đơn giản là sử dụng cờ thay thế hoặc bỏ qua. Thay đổi:

htmlspecialchars($aboutarray[0]['about_us'], ENT_COMPAT, "UTF-8") 

Để:

htmlspecialchars($aboutarray[0]['about_us'], ENT_COMPAT|ENT_SUBSTITUTE, "UTF-8") 

Hoặc:

htmlspecialchars($aboutarray[0]['about_us'], ENT_COMPAT|ENT_IGNORE, "UTF-8") 

Lưu ý: ENT_IGNORE loại bỏ các byte không tuân thủ. Điều này có thể gây ra a security issue. Sẽ tốt hơn nếu bạn hiểu nội dung của chuỗi và cách mã hóa. Sửa chữa nguồn gốc của vấn đề thay vì sử dụng ENT_IGNORE sửa lỗi đơn giản.

Bạn nên tự hỏi mình lý do tại sao chuỗi của bạn không được mã hóa theo UTF-8 ... nó nên, nhưng không phải.

Tôi cũng đã gặp sự cố này; bạn có thể đọc chi tiết về lý do tại sao một chuỗi trống đang được trả lại here.

+1

P.S. Tôi cũng khuyên bạn nên thay đổi ENT_COMPAT thành ENT_QUOTES, nhưng như mọi khi, tôi cho rằng điều đó phụ thuộc vào kịch bản cụ thể của bạn. – Lakey

+1

giải pháp tuyệt vời. – Centurion

+1

Câu trả lời này làm cho ngày của tôi .. Cảm ơn – emaniacs

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