Làm cách nào thay thế (sử dụng regex trong PHP5) các ký tự không hợp lệ trong chuỗi utf-8 trên các ký tự khoảng trắng?PHP: thay thế các ký tự không hợp lệ trong chuỗi utf-8 trong
Trả lời
Đ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
Đ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
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
Các iconv không hoạt động trường hợp của tôi (như các giải pháp khác) vì vậy tôi tìm thấy tôi ở đây một phần cho "xác nhận nhân vật":
Với mbstring bạn có thể làm:
$text = mb_convert_encoding($text, 'UTF-8', 'UTF-8');
Sẽ hoạt động khi bạn muốn (thay thế các ký tự không hợp lệ bởi khoảng trắng), nhưng dường như không hoạt động nếu bạn muốn thay thế các ký tự không hợp lệ bằng một số ký tự khác, chẳng hạn như ?
.
Xem: Replacing invalid UTF-8 characters by question marks, mbstring.substitute_character seems ignored
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);
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
Bạn muốn làm gì? thoát khỏi không gian màu trắng? hoặc utf-8 ký tự? Đưa ra một ví dụ. –
loại bỏ các ký tự UTF-8 thật dễ dàng: '$ text = '';' :-) – Joey