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.
http://stackoverflow.com/questions/29485602/qt-convert-unicode-entites – trante