| 写法 | Qt 视角 | isValid | isNull | Oracle 里 |
|---|---|---|---|---|
| QVariant() | 无类型 | false | false | NULL |
| QVariant(QString()) | QString | true | false | 空串(Oracle 当 NULL) |
| QVariant("") | QString | true | false | 空串(Oracle 当 NULL) |
| QVariant(QVariant::String) | QString | true | true | NULL |
| 写法 | isNull() | isEmpty() |
|---|---|---|
| QString() | true | true |
| QString("") | false | true |
| 写法 | C++类型 | Qt里怎么用 | 说明 |
|---|---|---|---|
'A' |
char |
❌ 不建议用于中文 | 普通窄字符 |
u'A' |
char16_t |
✅ QChar ch = u'A'; |
UTF-16 单元,最适合 QChar |
U'A' |
char32_t |
⚠ 很少用 | UTF-32 码点 |
L'A' |
wchar_t |
❌ 不推荐 | 平台相关 |
| 写法 | C++类型 | 含义 | 在 Qt 里的正确用法 |
|---|---|---|---|
"中文" |
const char[] |
源码编码(通常UTF-8) | ❌ 不要直接给 QString |
u8"中文" |
const char8_t[] / const char[] |
明确 UTF-8 | ✅ QString::fromUtf8(u8"中文") |
u"中文" |
const char16_t[] |
UTF-16 | ✅ QString::fromUtf16(u"中文") |
U"中文" |
const char32_t[] |
UTF-32 | ⚠ 很少用 |
L"中文" |
const wchar_t[] |
宽字符 | ❌ 不推荐 |
| 写法 | 类型 | 用途 |
|---|---|---|
QStringLiteral("中文") |
QString |
✅ 最推荐的 QString 常量写法 |
QLatin1String("abc") |
视图 | 只用于纯 ASCII / Latin-1 |
QStringView(u"中文") |
视图 | 指向 UTF-16 字面量 |
QUtf8StringView("abc")(Qt6) |
视图 | 指向 UTF-8 数据 |
| 构造形式 | 说明 |
|---|---|
| QString() | 空 |
| QString(const QString&) | 拷贝 |
| QString(QString&&) | 移动 |
| QString(QChar) | 单字符 |
| QString(const char16_t*, int) | UTF-16 |
| QString(QStringView) | 视图 |
| QString(QLatin1String) | 拉丁1 |
| 构造函数 | 实际行为 |
|---|---|
| QString(const char*) | fromLocal8Bit |
| QString(const QByteArray&) | fromLocal8Bit |
✅ Qt 4 → Qt 6 编码迁移对照表(已纠错 · 实战版)
一、字符串字面量 & QString 构造(❗重灾区,已修正)
❌ 原表错误点
-
把
"中文"在 Qt 4/5/6 全部标成local8bit -
把
QString("中文")也标成local8bit -
这是不区分"源码编码 vs Qt API 语义"的典型错误
✅ 正确版本
| 写法 | Qt 4 | Qt 5 | Qt 6 | 真实语义 | 迁移建议 |
|---|---|---|---|---|---|
"中文" |
按源码编码 | 按源码编码 | UTF-8 | C++ 字符串字面量 | Qt6 OK |
QString("中文") |
等同 fromAscii/fromLatin1 | ⚠ 依赖编译选项 | fromUtf8 | Qt 构造行为 | Qt6 OK |
QStringLiteral("中文") |
可用 | 推荐 | 强烈推荐 | 编译期 UTF-16 | ✅ 最优 |
u8"中文" |
❌ | ⚠ | ✅ | UTF-8 字面量 | Qt6 + fromUtf8 |
u"中文" |
❌ | ⚠ | ✅ | UTF-16 | Qt6 可用 |
⚠ 关键纠正说明(必须看)
-
Qt 4 / Qt 5:
-
"中文"的行为 取决于源码文件编码 -
不是 local8bit,而是 "你写的字节是什么"
-
-
Qt 6:
-
C++20 + Qt 强制假定 源码是 UTF-8
-
QString("中文")==QString::fromUtf8("中文")
-
✅ 结论
❌ "全版本禁止
QString("中文")"是错误结论✅ 正确结论:
Qt 4/5:不安全
Qt 6:合法但仍不如 QStringLiteral
二、char* / QByteArray → QString(这一部分你基本对)
| 用法 | Qt 4 | Qt 5 | Qt 6 | 正确理解 |
|---|---|---|---|---|
QString s = charPtr; |
fromLocal8Bit | fromLocal8Bit | fromLocal8Bit | ❌ 永远危险 |
QString s = ba; |
fromLocal8Bit | fromLocal8Bit | fromLocal8Bit | ❌ 同上 |
fromAscii() |
✅ | ⚠ deprecated | ❌ | → fromLatin1 |
fromUtf8() |
✅ | ✅ | ✅ | ✅ 主力 |
fromLocal8Bit() |
✅ | ✅ | ✅ | ⚠ 仅系统边界 |
✔ 这张表 基本正确,无需大改
三、QTextCodec / 全局编码(你这里"方向对,但说法夸张")
| 项目 | Qt 4 | Qt 5 | Qt 6 | 正确结论 |
|---|---|---|---|---|
| QTextCodec | ✅ | ⚠ deprecated | ❌ | Qt6 移除 |
| setCodecForTr | ✅ | ⚠ | ❌ | Qt6 不存在 |
| setCodecForCStrings | ✅ | ❌ | ❌ | Qt5 起已移除 |
| 全局编码切换 | ⚠ | ❌ | ❌ | Qt 从不推荐 |
⚠ 修正点:
-
Qt 4 从来就不推荐"全局编码切换"
-
Qt 5 不是"半残",而是功能在,但不建议用
四、QTextStream / 文件 I/O(你这里有明确错误)
❌ 原表错误
-
Qt 6 不是"setCodec 不可用"
-
setEncoding不是"唯一正确方式"
✅ 正确版本
| 用法 | Qt 4 | Qt 5 | Qt 6 | 说明 |
|---|---|---|---|---|
| 默认编码 | 本地 | 本地 | UTF-8 | Qt6 改变 |
| setCodec("UTF-8") | ✅ | ✅ | ⚠ 仍可用 | 兼容接口 |
| setEncoding(Utf8) | ❌ | ❌ | ✅ | 新 API |
✔ Qt 6 两种都能用,不是二选一
五、翻译(tr / lupdate)(你这部分基本正确)
| 项目 | Qt 4 | Qt 5 | Qt 6 | 结论 |
|---|---|---|---|---|
| 源码编码 | 任意 | 任意 | 必须 UTF-8 | Qt6 强制 |
| tr("中文") | 依赖 codec | 依赖 | UTF-8 | OK |
| .ts 文件 | 任意 | UTF-8 | UTF-8 | 无坑 |
✔ 此表 基本正确
六、qDebug / 控制台输出(你"怪 Qt",但锅在控制台)
| 项目 | Qt 4 | Qt 5 | Qt 6 | 真相 |
|---|---|---|---|---|
| 中文输出 | 易乱码 | 依赖环境 | 依赖环境 | ❌ 非 Qt 问题 |
| qDebug 行为 | 本地 | UTF-8 | UTF-8 | 输出没错 |
| 日志文件 | OK | OK | OK | UTF-8 即可 |
⚠ 修正结论:
Qt 6 并没有"仍不稳定",
不稳定的是 Windows 控制台默认 GBK
七、执行字符集 & 源码编码(这一张基本正确)
| 维度 | Qt 4 | Qt 5 | Qt 6 |
|---|---|---|---|
| 源码编码 | 任意 | 任意 | 强制 UTF-8 |
| 执行字符集 | 本地 | 本地 | 本地 |
| 非 UTF-8 源码容忍 | 高 | 中 | 极低 |
✔ 无大问题