2008-11-21 38 views
8

Tôi đang viết một số nguồn cấp dữ liệu RSS bằng PHP và đang cố vấn đề bằng mã hóa ký tự. Tôi có nên utf8_encode() trước hoặc sau khi htmlentities() mã hóa không? Ví dụ: tôi có cả ký hiệu và ký tự Trung Quốc trong phần tử mô tả và tôi không chắc chắn cái nào trong số này là đúng:utf-8 và htmlentities trong nguồn cấp dữ liệu RSS

$output = utf8_encode(htmlentities($source)); or 
$output = htmlentities(utf8_encode($source)); 

Và tại sao?

+0

Tại sao bạn không sử dụng UTF-8 ở địa điểm đầu tiên? – Gumbo

Trả lời

17

Điều quan trọng là để vượt qua các ký tự đặt cho htmlentities chức năng, như là mặc định là ISO-8859-1:

utf8_encode(htmlentities($source,ENT_COMPAT,'utf-8')); 

Trước tiên, bạn nên áp dụng htmlentities để cho phép utf8_encode mã hóa các thực thể đúng cách.

(EDIT: Tôi đã thay đổi ý kiến ​​của mình trước khi đơn hàng không quan trọng dựa trên các nhận xét. Mã này được kiểm tra và hoạt động tốt).

+0

Đơn đặt hàng không thành vấn đề! utf8_encode trước htmlentities() sẽ thay đổi cách nó hoạt động. So sánh chuỗi urldecode ('% E2% 82% AC') có và không áp dụng utf8_encode() trước tiên. – Kornel

+0

Bạn nói đúng, tuy nhiên có vẻ như sử dụng htmlentities trước tiên là phương pháp chính xác (đã thử nghiệm nó). Thay đổi bài viết của tôi để phản ánh nó. –

1

Bạn muốn làm $output = htmlentities(utf8_encode($source));. Điều này là do bạn muốn chuyển đổi các ký tự quốc tế của bạn thành đúng UTF8 đầu tiên, và sau đó có ký hiệu (và có thể một số ký tự UTF-8) được chuyển sang thực thể HTML. Nếu bạn thực hiện các thực thể trước, thì một số ký tự quốc tế có thể không được xử lý đúng cách.

Nếu không ai trong số các nhân vật quốc tế của bạn sẽ được thay đổi bằng cách utf8_encode, sau đó nó không quan trọng mà theo thứ tự bạn gọi cho họ ở.

5

Không sử dụng htmlentities()!

Chỉ cần sử dụng các ký tự UTF-8. Chỉ cần đảm bảo bạn khai báo mã hóa nguồn cấp dữ liệu trong tiêu đề HTTP (Content-Type:application/xml;charset=UTF-8) hoặc không thực hiện điều đó, trong chính nguồn cấp dữ liệu bằng cách sử dụng <?xml version="1.0" encoding="UTF-8"?> trên dòng đầu tiên.

1

Nó có thể dễ dàng hơn để quên htmlentities và sử dụng một phần CDATA. Nó hoạt động cho phần tiêu đề, mà dường như không hỗ trợ mã hóa ký tự HTML trong xem RSS của Firefox:

<title><![CDATA[News & Updates " > » ☂ ☺ ☹ ☃ Test!]]></title> 
12

đầu tiên: utf8_encode function chuyển đổi từ ISO 8859-1 sang UTF-8. Vì vậy, bạn chỉ cần chức năng này, nếu mã hóa/bộ mã hóa đầu vào của bạn là ISO 8859-1. Nhưng tại sao bạn không sử dụng UTF-8 ngay từ đầu?

Thứ hai: Bạn không cần htmlentities. Bạn chỉ cần htmlspecialchars để thay thế các ký tự đặc biệt theo tham chiếu ký tự. htmlentities sẽ thay thế các ký tự "quá nhiều" có thể được mã hóa trực tiếp bằng UTF-8. Quan trọng là bạn sử dụng kiểu trích dẫn ENT_QUOTES để thay thế dấu nháy đơn.

Vì vậy, đề nghị của tôi:

// if your input encoding is ISO 8859-1 
htmlspecialchars(utf8_encode($string), ENT_QUOTES) 

// if your input encoding is UTF-8 
htmlspecialchars($string, ENT_QUOTES, 'UTF-8') 
+0

Giải pháp này đã giúp tôi. Chính xác phần về 'ENT_QUOTES'. Cảm ơn – helvete

0

Sau nhiều lỗi thử nghiệm &, cuối cùng tôi đã tìm ra cách để hiển thị đúng một chuỗi từ một giá trị cơ sở dữ liệu utf8 mã hóa, thông qua một tập tin xml, đến một trang html:

$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>'; 

Tôi hy vọng điều này sẽ giúp ai đó.

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