2013-04-04 39 views
6

Tất nhiên điều này đã được hỏi trước và đã tìm kiếm các giải pháp, tất cả đều chưa hoạt động. Tôi muốn thay đổi ra biểu tượng TM và dấu và để equivelents html của họ bằng cách sử dụng htmlentities hoặc htmlspecialchars:PHP htmlentities không hoạt động ngay cả với tham số

$TEST = "Kold Locker™ & other stuff"; 
echo "ORGINIAL: " . $TEST . "<BR/>"; 

echo "HTML: " . htmlentities($TEST, ENT_COMPAT, 'UTF-8'); 

này hiển thị:

ORGINIAL: Kold Locker™ & other stuff 
HTML: 

Tôi cũng đã thử nó với htmlspecialchars và tham số thứ hai thay đổi với cùng một kết quả.

Tôi thiếu gì mà người khác đã xác nhận quyền sở hữu làm việc trong các giải pháp khác?

CẬP NHẬT: Tôi đã cố gắng chỉ hiển thị utf8_encode($TEST) và nó hiển thị HTML: Kold Locker™ & other stuff

+0

Set display_errors để '1' và thiết lập error_reporting cho' E_ALL'. Bạn có thể nhận được một thông báo lỗi. – Halcyon

+0

gì phiên bản của php? – Prisoner

+0

Tôi đã kiểm tra báo cáo với không niêm yết – ToddN

Trả lời

2

Mã của bạn làm việc cho tôi: -?

Trong manual page for htmlentities() chúng ta có thể đọc:

Return Values ​​

Trả về chuỗi được mã hóa.

Nếu chuỗi đầu vào chứa chuỗi đơn vị mã không hợp lệ trong vòng mã hóa đã cho, chuỗi rỗng sẽ được trả về, trừ khi cờ ENT_IGNORE hoặc ENT_SUBSTITUTE được đặt.

Tôi đoán là dữ liệu đầu vào không được mã hóa đúng như UTF-8 và hàm trả về một chuỗi rỗng. (Giả sử rằng các kịch bản không đâm, ví dụ, mã sau phần mà vẫn chạy.)

+0

Tôi nghĩ rằng bạn đang ở trên một cái gì đó, hãy để tôi thử và mã hóa trước khi thêm 'htmlentities' – ToddN

5

Tôi không biết tại sao, điều này đã làm việc cho tôi (htmlentities phải được gọi là hai lần đối với tôi)

$html="<html> <head><head>something like this </html>" 
$entities_correction= htmlentities($html, ENT_COMPAT, 'UTF-8'); 
echo htmlentities($entities_correction, ENT_COMPAT, 'UTF-8'); 

đầu ra:

&lt;html&gt; &lt;head&gt;&lt;head&gt;something like this &lt;/html&gt;

+1

Thật lạ lùng, bởi vì tôi phải gọi htmlentities hai lần để mã hóa nó. Tại sao? Nó kỳ lạ bởi vì tôi chưa bao giờ gặp vấn đề này trước và ngoài hư không nó sẽ không tự làm việc. –

3

Tôi nghĩ tôi đã có cùng một vấn đề như Pjack (msg của ngày 14 tháng 7 tại 08:54):

$str = "A 'quote' is <b>bold</b>"; 
echo htmlentities($str); 

cho trong trình duyệt (Firefox trong trường hợp của tôi) bản gốc chuỗi $ str (không có bất kỳ dịch), trong khi

echo htmlentities(htmlentities($str)); 

cho:

A 'quote' is &lt;b&gt;bold&lt;/b&gt; 

(tôi sử dụng PHP/5.4.16 thu được từ windows-7 XAMPP).

Tuy nhiên, sau khi một số ý kiến ​​khác xảy ra với tôi rằng Trình duyệt hiển thị các chuỗi & lt; và & gt; dưới dạng> và <. (Xem mã nguồn trong trình duyệt). Cuộc gọi thứ hai của htmlentities dịch & thành &amp; và chỉ khi đó Trình duyệt hiển thị những gì bạn mong đợi ở địa điểm đầu tiên.

0

Tôi đã có gần như cùng một vấn đề (trong đó bằng cách nào đó nó cho thấy cùng một văn bản mỗi lần) và với một sự kết hợp của echo khác nhau của tôi đã nhận nó. Có vẻ như các webbrowsers như firefox hiển thị cùng một văn bản mỗi lần. Đó là bởi vì khi bạn echo văn bản htmlentities, nó đang được chuyển đổi trở lại thành văn bản bình thường trong khi lặp lại. Khi tôi lặp lại một tập lệnh với biến/văn bản là console.log ged, nó thực sự lặp lại văn bản htmlentities (gần như) một cách chính xác. Thay vì thay thế tất cả các char đặc biệt bằng mã html, nó thay thế ´em bằng một số mã hóa khác mà tôi đã thấy trước đây (tôi không thể nhớ tên). Htmlentities-ing nó một lần nữa, tôi nhận được cùng một văn bản echo´d một lần nữa (nhớ nó chuyển đổi tất cả mọi thứ), nhưng echoing nó trong console.log-phiên bản mang lại cho tôi kết quả mong đợi. Bây giờ, một lần nữa, kết quả là:
1. Thực hiện htmlentitieshai lần!
2. Đừng (ít nhất với firefox) echo các htmlentities như bình thường vào trang web. Nếu bạn muốn kiểm tra xem giá trị có thực sự chính xác hay không, hãy echo một tập lệnh ghi nhật ký vào bảng điều khiển.
Tôi hy vọng điều này có thể giúp kẻ khác với cùng một vấn đề,
VicStudio

EDIT: 3. Nếu bạn đang sử dụng một công thức $_POST, đừng quên thêm accept-charset="UTF-8" (hoặc một số charset khác) đến <form>.

SỬA THÊM CHỈNH SỬA: Chỉ thực hiện 2 lần htmlentities nếu bạn muốn lặp lại kết quả bình thường của bạn vào trang. Nếu bạn muốn gửi trực tiếp bằng e.e. một cơ sở dữ liệu, chỉ làm điều đó một lần! -> những gì tôi đã nói trước đây là sai một phần. :(

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