2011-10-05 38 views
8

Tôi đang gặp sự cố với mã số htmlentities và ký tự é của PHP. Tôi biết đó là một số vấn đề mã hóa mà tôi chỉ nhìn, vì vậy hy vọng ai đó có thể thấy tôi đang làm gì sai.htmlentities và é (e cấp tính)

Chạy thẳng htmlentities("é") không trả lại mã đúng như mong đợi (hoặc é hoặc é. Tôi đã cố gắng buộc charset là 'UTF-8' (sử dụng các tham số charset của htmlentities) nhưng điều tương tự.

Mục tiêu cuối cùng là để nhân vật này được gửi trong một email HTML được mã hóa trong 'ISO-8859-1'. Khi tôi cố gắng ép nó vào mã hóa đó, cùng một vấn đề. Trong nguồn của email, bạn thấy é, và trong chế độ xem HTML é.

Ai có thể làm sáng tỏ một số lỗi của tôi?

+0

Thử gọi 'get_html_translation_table() 'và nhìn vào mảng kết quả. Điều này sẽ cho bạn biết liệu e-cấp tính của bạn có nên được dịch hay không. Nếu điều này không làm việc, bạn luôn có thể nhận được bảng này, thêm e-cấp tính vào nó và sau đó sử dụng 'strtr ($ string, $ table)' để làm việc mã hóa. –

+0

Đảm bảo tệp của bạn được mã hóa bằng UTF-8 và đảm bảo bạn đã đặt chính xác ký tự mã hóa . –

+0

Nếu bạn đặt mã hóa trang web thành UTF-8 (bằng cách sử dụng các tiêu đề http: // 'hoặc tiêu đề http, bạn sẽ không cần phải mã hóa các ký tự có dấu trọng âm ở tất cả) – Spudley

Trả lời

11
// I assume that your page is utf-8 encoded 
header("Content-type: text/html;charset=UTF-8"); 

$in_utf8encoded = "é à ù è ò"; 

// first you need the convert the string to the charset you want... 
$in_iso8859encoded = iconv("UTF-8", "ISO-8859-1", $in_utf8encoded); 

// ...in order to make htmlentities work with the same charset 
$out_iso8859= htmlentities($in_iso8859encoded, ENT_COMPAT, "ISO-8859-1"); 

// then only to display in your page, revert it back to utf-8 
echo iconv("ISO-8859-1", "UTF-8", $out_iso8859); 
+0

Cảm ơn bạn! 'Iconv' đã được sửa vấn đề mã hóa email của tôi. –

+0

bạn được chào đón :) –

+0

Việc thêm mã hóa là chìa khóa ở đây - đặc biệt nếu htmlentities hoạt động cho bạn trước đây và đã bị hỏng. Nhóm PHP đã có ý tưởng khéo léo để không chỉ thay đổi * mặc định * thành htmlentities một lần mà là hai lần. Trước 5.4, nó là ISO-8859-1. Sau 5.4 và trước 5.6 là UTF-8. Như của 5.6, đó là bất cứ thiết lập default_charset trong php.ini của bạn nói. Khi bạn chỉ định mã hóa, nó sẽ hoạt động trở lại, không cần htmlspecialchars.Hãy ghi nhớ điều đó nếu bạn đột nhiên bị mất dữ liệu vì bạn dựa vào các mặc định (!) Được ghi lại không thay đổi. PHP luôn luôn đầy bất ngờ - và không phải là một cách tốt. – Aaa

2

Tôi đề nghị bạn hãy xem http://php.net/html_entity_decode. Bạn có thể sử dụng tùy chọn này theo cách sau:

$eacute = html_entity_decode("é",ENT_COMPAT,"iso-8859-1"); 

Bằng cách này bạn không phải quan tâm đến việc mã hóa tệp php. chỉnh sửa: typo

+0

Tôi không cố gắng giải mã –

-3

Nếu bạn đã lưu trữ các ký tự đặc biệt dưới dạng é, thì bạn có thể sử dụng sau ngay sau khi kết nối với database.

mysql_set_charset('utf8', $dbHandler); 

Với điều này, bây giờ bạn không cần phải sử dụng htmlentities trong khi hiển thị dữ liệu.

+0

Tôi không nhớ nói gì về một cơ sở dữ liệu –

+0

Tôi biết, nhưng tôi đề nghị một cái gì đó mà làm việc với tôi trong tình hình tương tự như của bạn.Sử dụng cách này, nó sẽ mã hóa tất cả mọi thứ trong khi kéo từ cơ sở dữ liệu và sẽ tránh sử dụng các hàm php khác như 'htmlentities',' html_entity_decode', 'html_entity_encode' etc –

+0

Tình trạng của tôi không liên quan đến cơ sở dữ liệu theo bất kỳ cách nào, hình dạng hoặc biểu mẫu nào. Vui lòng đọc trước khi đăng bài vội vàng –

2

Tôi đã thêm htmlspecialchars để bạn có thể thấy rằng nó thực sự được mã hóa

http://sandbox.phpcode.eu/g/11ce7/4

<?PHP 
echo htmlspecialchars(htmlentities("é", ENT_COMPAT | ENT_HTML401, "UTF-8")); 
Các vấn đề liên quan