2010-09-27 31 views

Trả lời

13

Hãy chắc chắn để xác định mã hóa sang UTF-8 nếu các tập tin của bạn được mã hóa như vậy:

htmlspecialchars($str, ENT_COMPAT, 'UTF-8'); 

Các charset mặc định cho htmlspecialchars là ISO-8859-1 (như PHP v5.4 charset mặc định đã được chuyển thành 'UTF-8'), điều này có thể giải thích tại sao mọi thứ trở nên khô khan khi gặp các ký tự nhiều byte.

+0

Dòng 207 đang ở đây. $ charset = 'UTF-8'; htmlspecialchars ($ text, ENT_QUOTES, $ charset); // Line 207 – gautamlakum

+1

Đối với tôi, vấn đề này đã kết thúc ngược lại, ký tự dữ liệu của tôi thực sự là 'ISO-8859-1' khi tôi cố gắng mã hóa nó thành 'UTF-8' trong htmlspecialchars. Tôi đã chuyển đối số bộ ký tự thành 'ISO-8859-1' và giải quyết được sự cố. Ít nhất, cho đến khi tôi hoàn toàn có thể cập nhật mọi thứ thành 'UTF-8'. – Kzqai

+5

Bắt đầu từ PHP 5.4.0, giá trị mặc định của tham số thứ 3 của 'htmlspecialchars()' là ''UTF-8'' - câu trả lời này sẽ được cập nhật. –

4

Bạn đang cung cấp dữ liệu ký tự bị hỏng vào hàm hoặc không chỉ định mã hóa đúng.

Tôi đã gặp vấn đề này một thời gian trước, hành vi cũ (trước PHP 5.2.7 tôi tin) là trả về chuỗi mặc dù tham nhũng, nhưng kể từ phiên bản đó nó sẽ ném lỗi này thay thế.

Giải pháp của tôi liên quan đến việc viết tập lệnh để cung cấp chuỗi của tôi thông qua iconv bằng cách sử dụng // công cụ sửa đổi IGNORE để xóa dữ liệu bị hỏng.

(Chúng tôi đã có cơ sở dữ liệu bị hỏng có một số chuỗi trong UTF-8, một số trong latin-1 thường có các loại ký tự được xác định không chính xác trên các cột).

(Nhìn vào bình luận cho câu trả lời Tatu, tôi sẽ bắt đầu bằng cách nhìn vào (và chơi với) các nội dung của biến $ charset.

+0

Tôi đồng ý. Tôi đã chuyển dữ liệu người dùng thông qua iconv hoặc mb_convert_encoding(), với bộ ký tự 'từ' và 'đến' giống nhau. Thường có một tùy chọn để tách các ký tự không hợp lệ. –

+0

Dữ liệu bị hỏng ở đây là tốt, mb_convert_encoding ($ var, 'UTF-8') đã thực hiện công việc. –

0

Đó là thực sự là một trong những lỗi thường xuyên nhất mà tôi nhận được.

Đôi khi tôi không sử dụng __() dịch - chỉ văn bản thuần túy của Đức có chứa äöü Có một điều đặc biệt quan trọng là phải chú ý đến việc mã hóa các tập tin này

Vì vậy, hãy đảm bảo lưu đúng các tệp có chứa ký tự đặc biệt như UTF8.

+0

liên kết bị hỏng. – billynoah

1

Mã đúng để không nhận được bất kỳ lỗi là:

htmlentities($string, ENT_IGNORE, 'UTF-8') ;

Bên cạnh đó bạn cũng có thể sử dụng str_replace để thay thế một số nhân vật xấu đến nhu cầu của bạn và sau đó sử dụng htmlentities chức năng.

Hãy xem điều này rss feed nó đã thay thế ký hiệu html lớn hơn thành gt; thẻ có thể không đẹp khi đọc nguồn cấp dữ liệu rss. Bạn có thể thay thế thứ này bằng dấu "-" hoặc ")" và v.v.

1

Có cùng vấn đề vì tôi đang sử dụng substr trên chuỗi utf-8.
Lỗi không thường xuyên và có vẻ ngẫu nhiên. Lỗi xảy ra chỉ khi chuỗi được cắt trên char nhiều byte!

mb_substr giải quyết được sự cố :)