2013-08-14 42 views
10

Trong Qt, có cách nào để kiểm tra xem một mảng byte có phải là một chuỗi UTF-8 hợp lệ không?Kiểm tra xem chuỗi UTF-8 có hợp lệ trong Qt

Dường như QString::fromUtf8() âm thầm ngăn chặn hoặc thay thế chuỗi không hợp lệ mà không thông báo cho người gọi rằng có bất kỳ trình tự nào. Đây là từ tài liệu của nó:

Tuy nhiên, trình tự không hợp lệ có thể xảy ra với UTF-8 và, nếu có như vậy được tìm thấy, họ sẽ được thay thế bằng một hoặc nhiều "nhân vật thay thế", hoặc bị ức chế.

+0

Tôi nghi ngờ rằng để kiểm tra tính hợp lệ của chuỗi UTF8, bạn cần sử dụng thư viện Unicode. –

+0

Tôi tìm thấy đoạn mã này: [https://github.com/JulienPalard/is_utf8]. Nó có thể hữu ích. –

+0

Liên kết cho tôi "Không tìm thấy trang" – sashoalm

Trả lời

13

Hãy thử với QTextCodec::toUnicode và chuyển một ví dụ ConverterState. ConverterState có các thành viên như invalidChars. Tuy nhiên, chúng không được ghi nhận thông qua doxygen, nhưng tôi cho rằng chúng là API công khai, vì chúng được đề cập trong tài liệu QTextCodec.

Mẫu mã:

QTextCodec::ConverterState state; 
QTextCodec *codec = QTextCodec::codecForName("UTF-8"); 
const QString text = codec->toUnicode(byteArray.constData(), byteArray.size(), &state); 
if (state.invalidChars > 0) { 
    qDebug() << "Not a valid UTF-8 sequence."; 
} 
+1

Cảm ơn, điều đó đã đưa tôi đi đúng hướng. Hóa ra có một cách đơn giản hơn bằng cách sử dụng [QTextCodec :: codecForUtfText()] (http://qt-project.org/doc/qt-4.8/qtextcodec.html#codecForUtfText), cho phép bạn chỉ định một codec mặc định nếu không Mã hóa UTF phù hợp cho văn bản. Tôi đã chỉ định [QTextCodec :: codecForLocale()] (http://qt-project.org/doc/qt-4.8/qtextcodec.html#setCodecForLocale) làm codec mặc định. – sashoalm

2

Các ConverterState bằng cách nào, mà đã được báo cáo here bởi Frank Osterfeld, hoạt động ngay cả khi văn bản đã không có một "BOM (Byte Order Mark)" (*).

(*) Không giống như QTextCodec::codecForUtfText(), cần có BOM trong văn bản để biết rằng nó nằm trong Utf-8.

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