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

Qt 三大字串類型互轉完全指南:QString、std::string、char* 雙向轉換

     編輯:關於C語言

Qt 開發中,`QString` (Qt 核心)、`std::string` (C++ 標準庫)、`char*` (C 風格) 三種字串類型並存,頻繁互轉。本文整理最常用、最高效的轉換方法,釐清所有權與編碼陷阱,附帶 `int` 轉 `QString` 實用技巧。

一、類型定義與編碼前提

  • QString:Unicode 內部存儲 (UTF-16),功能最豐富。
  • std::string:位元組序列,無編碼語義,通常配合 UTF-8 使用。
  • char*:C 風格字串,依賴約定編碼 (常為本地編碼或 UTF-8)。

關鍵:轉換涉及編碼轉換,Qt 5/6 預設 `toStdString()`/`fromStdString()` 使用 UTF-8,`toLocal8Bit()`/`fromLocal8Bit()` 使用系統本地編碼 (Windows 為 GBK/CP936,Linux 為 UTF-8)。

二、雙向轉換速查表

來源 → 目標代碼說明
std::string → QStringQString qtStr = QString::fromStdString(stdStr);推薦 (Qt 5+),假設 stdStr 為 UTF-8
QString qtStr = QString::fromLocal8Bit(stdStr.c_str());假設 stdStr 為系統本地編碼
QString → std::stringstd::string stdStr = qtStr.toStdString();推薦 (Qt 5+),輸出 UTF-8
std::string stdStr = qtStr.toLocal8Bit().toStdString();輸出系統本地編碼 (Qt 5 需兩步)
char* → QStringQString qtStr = QString::fromUtf8(chStr);假設 chStr 為 UTF-8
QString qtStr = QString::fromLocal8Bit(chStr);假設 chStr 為本地編碼
QString → char* (臨時)const char *chStr = qtStr.toUtf8().constData();生命週期綁定臨時 QByteArray,**勿存指標**
const char *chStr = qtStr.toLocal8Bit().constData();同上,本地編碼版
QString → char* (持久)QByteArray ba = qtStr.toUtf8(); char *buf = strdup(ba.constData());需自行 `free(buf)`,或用 `std::string` 管理
std::string → char*const char *chStr = stdStr.c_str();指標有效期同 stdStr,**勿修改**
char* → std::stringstd::string stdStr(chStr);構造函數複製內容,安全

三、⚠️ 高頻坑點與最佳實踐

1. 臨時對象生命週期陷阱


// 錯誤!toUtf8() 返回臨時 QByteArray,語句結束即銷毀,指標懸空
const char *bad = qtStr.toUtf8().constData(); 

// 正確:延長 QByteArray 生命週期
QByteArray ba = qtStr.toUtf8(); 
const char *good = ba.constData(); // ba 存活期間指標有效

2. 編碼不匹配導致亂碼

  • Windows 控制台預設 GBK,Qt 內部 UTF-16,讀寫文件/管道/網絡**必須顯式指定編碼**。
  • 跨平台建議:內部統一 UTF-8 (`toUtf8`/`fromUtf8`),邊界處轉換。

3. `toAscii()` / `toLatin1()` 已棄用

Qt 5 移除 `toAscii()`,Qt 6 移除 `toLatin1()`。請改用 `toUtf8()` 或 `toLocal8Bit()`。

四、實用技巧:數值與 QString 互轉


// int → QString
int a = 10;
QString b = QString::number(a);           // "10"
QString c = QString::number(a, 16);       // "a" (十六進位)
QString d = QString("%1").arg(a, 4, 10, QChar('0')); // "0010" (格式化)

// QString → int (帶錯誤檢查)
bool ok;
int val = "123".toInt(&ok);               // ok=true, val=123
int val2 = "abc".toInt(&ok);              // ok=false, val2=0

// 浮點數格式化
QString pi = QString::number(3.14159, 'f', 2); // "3.14" (固定2位小數)

五、現代 C++ 風格封裝建議


// 輔助函數:安全獲取 UTF-8 char*
inline std::string qtToUtf8(const QString &s) { return s.toUtf8().toStdString(); }
inline QString utf8ToQt(const std::string &s) { return QString::fromUtf8(s.c_str()); }

// 用法
std::string utf8 = qtToUtf8(qtStr);
QString qt = utf8ToQt(utf8);

掌握這些轉換模式,能消除 Qt 專案中 90% 的字串編碼與生命週期 Bug,讓你專注於業務邏輯而非字元編碼糾結。

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