2011-01-31 29 views
12

Điều này nghe có vẻ giống như một câu hỏi rõ ràng, nhưng tôi thiếu một số thứ về cách UTF-8 được mã hóa hoặc cách hàm toUtf8 hoạt động.QString :: toUtf8 đang làm gì?

Hãy xem xét một chương trình rất đơn giản

QString str("Müller"); 
qDebug() << str << str.toUtf8().toHex(); 

Sau đó, tôi nhận được đầu ra

"Müller" "4dc383c2bc6c6c6572" 

Nhưng tôi đã có ý tưởng về các letter ü nên đã được mã hóa như c3bc và không c383c2bc.

Cảm ơn Johan

+0

http://stackoverflow.com/questions/29485602/qt-convert-unicode-entites – trante

Trả lời

17

Tùy thuộc vào mã hóa mã nguồn của bạn.

Tôi có xu hướng nghĩ rằng tệp của bạn đã được mã hóa bằng UTF-8, ký tự ü được mã hóa là C3 trước Công nguyên.

Bạn đang gọi hàm tạo QString::QString (const char * str), theo http://doc.qt.io/qt-4.8/qstring.html#QString-8, chuyển đổi chuỗi thành unicode bằng phương thức QString :: fromAscii() theo mặc định sẽ xem đầu vào là nội dung Latin1.

Vì C3 và BC đều hợp lệ trong tiếng Latin 1, đại diện cho tương ứng & Atilde; và & frac14 ;, chuyển đổi chúng sang UTF-8 sẽ dẫn đến các ký tự sau:

& Atilde; (C3) -> C3 83

& frac14; (BC) -> C2 BC

dẫn đến chuỗi bạn nhận được: "4d c3 83 c2 bc 6c 6c 65 72"

Tổng hợp những thứ lên, đó là đôi mã hóa UTF-8.

Có nhiều lựa chọn để giải quyết vấn đề này:

1) Bạn có thể chuyển đổi tập tin nguồn của bạn để Latin-1 sử dụng soạn thảo văn bản yêu thích của bạn.

2) Bạn có thể thoát đúng ký tự ü vào \ xFC trong chuỗi phân đoạn, vì vậy chuỗi sẽ không phụ thuộc vào mã hóa của tệp.

3) bạn có thể giữ các tập tin và chuỗi như UTF-8 dữ liệu và sử dụng QString str = QString::fromUtf8 ("Müller");

Cập nhật: Vấn đề này là không còn phù hợp trong QT5. http://doc.qt.io/qt-5/qstring.html#QString-8 tuyên bố rằng hàm tạo hiện sử dụng QString::fromUtf8() nội bộ thay vì QString::fromAscii(). Vì vậy, miễn là mã hóa UTF-8 được sử dụng nhất quán, nó sẽ được sử dụng theo mặc định.

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