2009-09-16 38 views

Trả lời

22

sử dụng iconv

$text = iconv("UTF-8", "UTF-8//IGNORE", $text); 

thấy manual.

Cheers

+7

Điều này không hiệu quả đối với tôi. ký tự không hợp lệ được giữ nguyên. giống như nó không hoạt động cho bobef. nó không thực hiện công việc. – Rodniko

+0

Điều này làm việc cho tôi. Tệp nguồn đã được tải xuống mã CSV của các mã nhượng quyền SBA, mà tôi đã định dạng theo cách thủ công thành JSON được sử dụng trong trình tạo giống Laravel. Nhưng mặc dù tệp được định dạng của tôi đã thông qua xác thực JSON, nhưng các ký tự UTF-8 bị ẩn, không hợp lệ vẫn nằm trong tệp mà PHP không thể giải mã được. – Ixalmida

+0

Tôi chưa được gỡ lỗi vào chi tiết nhưng biểu tượngv cũng như mb_convert không giải quyết vấn đề với json_encode() Nó có thể giúp ích trong nhiều trường hợp, không phải trong tất cả. – John

1

Nếu bạn đã đi qua những lỗi ‘nhân vật không hợp lệ’ nguyền rủa trong khi sử dụng XML PHP hoặc JSON phân tích cú pháp sau đó bạn có thể quan tâm đến việc này.

Thật không may, các trình phân tích cú pháp XML và JSON của PHP không bỏ qua các ký tự không phải UTF8, mà là chúng dừng lại và ném một lỗi khá vô ích. Tôi đã tìm thấy biểu mẫu mã dưới đây và hoạt động xuất sắc cho tôi ..

//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ? 
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'. 
'|[\x00-\x7F][\x80-\xBF]+'. 
'|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'. 
'|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'. 
'|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S', 
'?', $some_string); 

//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ? 
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'. 
'|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string); 
+0

không giải quyết vấn đề với json_encode. nó báo cáo một số UTF8 hợp lệ cũng là không hợp lệ, đáng buồn mà không đưa ra một đầu mối vấn đề là gì. – John

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