C++ 提供了 char* (C 風格) 和 std::string,但 Qt 依然堅持自研 QString。核心原因只有一個:**原生 Unicode 支持**。QString 內部以 UTF-16 (16 位 Unicode) 編碼存儲,ASCII、Latin-1 等皆為其子集。這意味著:
| 特性 | 說明 |
|---|---|
| 編碼 | UTF-16,支援 BMP 及輔助平面字符 |
| 內存管理 | 隱式共享 (Copy-on-Write),賦值極廉價 |
| \0 處理 | 字符串中間可包含 \0,length() 返回真實長度 |
| 運算符重載 | +、+= 支援直觀拼接,性能優異 |
QString str = "User: ";
str += userName + "\n"; // 運算符鏈式拼接
str.append("Login at: ").append(timeStr); // append() 鏈式調用
arg() 而非 sprintf()// 類型安全、支援任意類型、無格式化字符串漏洞風險
QString msg = QString("%1 %2 (%3-%4)")
.arg("permissive").arg("society").arg(1950).arg(1970);
// 輸出: "permissive society (1950-1970)"
// 數值 -> 字符串
QString s1 = QString::number(54.3);
QString s2; s2.setNum(54.3);
// 字符串 -> 數值(帶錯誤檢查)
bool ok;
double d = str.toDouble(&ok);
if (ok) { /* 轉換成功 */ }
QString x = "Nine pineapples";
QString y = x.mid(5, 4); // "pine" (位置5, 長度4)
QString z = x.mid(5); // "pineapples" (位置5 到尾)
QString s = "Pineapple";
s.left(4); // "Pine"
s.right(5); // "apple"
"sticky question".indexOf("sti", 1); // 返回 10 (從位置1開始找)
if (url.startsWith("http:") && url.endsWith(".png")) { ... }
// 比 left()/right() 更清晰、性能更優
str.toLower(); str.toUpper();
str.trimmed(); // 去除兩端空白字符(含 \t \n)
str.simplified(); // 合併連續空白為單個空格並去首尾
str.replace("old", "new");
str.insert(pos, "text");
str.remove(pos, len);
// const char* -> QString (隱式轉換)
str += " (1870)";
// QString -> const char* (兩步走,生命週期綁定 QByteArray)
printf("User: %s\n", str.toUtf8().constData()); // 推薦 toUtf8() 而非舊 toAscii()
// 便利宏
printf("User: %s\n", qPrintable(str)); // 等價於 toUtf8().constData()
⚠️ 內存安全提示:qPrintable()返回的指釖臨時QByteArray生命週期綁定,語句結束即失效,**切勿長期持有**該指針。
QString 以 Unicode 為核心、隱式共享為性能基石、豐富 API 為生產力保障,是 Qt 應用開發中不可或缺的基石類。掌握其慣用模式,能讓字符串處理代碼既安全又優雅。