首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Qt 核心類深度解析(五十):QString —— Unicode 時代的字符串利器

     編輯:關於C語言

為什麼 Qt 要重造字符串輪子?

C++ 提供了 char* (C 風格) 和 std::string,但 Qt 依然堅持自研 QString。核心原因只有一個:**原生 Unicode 支持**。QString 內部以 UTF-16 (16 位 Unicode) 編碼存儲,ASCII、Latin-1 等皆為其子集。這意味著:

  • 無需擔心多字節編碼轉換陷阱
  • 天然支援中日韓等複雜文字系統
  • 內存管理、\0 結尾判邏輯全自動處理

核心特性速覽

特性說明
編碼UTF-16,支援 BMP 及輔助平面字符
內存管理隱式共享 (Copy-on-Write),賦值極廉價
\0 處理字符串中間可包含 \0,length() 返回真實長度
運算符重載+、+= 支援直觀拼接,性能優異

常用操作實戰指南

1. 構建與拼接

QString str = "User: ";
str += userName + "\n";           // 運算符鏈式拼接
str.append("Login at: ").append(timeStr); // append() 鏈式調用

2. 格式化輸出:推薦 arg() 而非 sprintf()

// 類型安全、支援任意類型、無格式化字符串漏洞風險
QString msg = QString("%1 %2 (%3-%4)")
              .arg("permissive").arg("society").arg(1950).arg(1970);
// 輸出: "permissive society (1950-1970)"

3. 數值與字符串雙向轉換

// 數值 -> 字符串
QString s1 = QString::number(54.3);
QString s2; s2.setNum(54.3);

// 字符串 -> 數值(帶錯誤檢查)
bool ok;
double d = str.toDouble(&ok);
if (ok) { /* 轉換成功 */ }

4. 子串提取與查找

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開始找)

5. 邊界檢查與大小寫轉換

if (url.startsWith("http:") && url.endsWith(".png")) { ... }
// 比 left()/right() 更清晰、性能更優

str.toLower(); str.toUpper();
str.trimmed();        // 去除兩端空白字符(含 \t \n)
str.simplified();     // 合併連續空白為單個空格並去首尾

6. 替換、插入、刪除

str.replace("old", "new");
str.insert(pos, "text");
str.remove(pos, len);

與 C 風格字符串互操作

// 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 應用開發中不可或缺的基石類。掌握其慣用模式,能讓字符串處理代碼既安全又優雅。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved