【Qt】QString字符串编码格式与数据转换

发布于:2025-07-04 ⋅ 阅读:(15) ⋅ 点赞:(0)

QString 提供了多种静态方法用于将不同编码格式的原始数据转换为 QString 对象。以下是常用方法的全面对比:


1. fromLatin1(const char *str, int size = -1)

  • 功能:将 Latin-1(ISO 8859-1)编码的 C 字符串转换为 QString
  • 输入类型
    • 单字节字符集(每个字节直接映射到 Unicode 的前 256 个码点)。
  • 适用场景
    • ASCII 或 ISO 8859-1 编码的文本,如西欧语言。
  • 支持中文:❌ 不支持中文等多语言字符。
  • 性能:较快,因为是单字节处理。
  • 典型用途:简单英文或西欧文字。

cpp

QString str = QString::fromLatin1("Hello");


2. fromLocal8Bit(const char *str, int size = -1)

  • 功能:将本地 8 位编码(通常是系统默认编码,如 Windows 上的 GBK、Linux 上的 UTF-8)转换为 QString
  • 输入类型
    • 本地编码字符串(可能因平台而异)。
  • 适用场景
    • 处理本地编码的字符串,比如读取文件名、环境变量等。
  • 支持中文:✅ 支持本地编码中的中文字符(如 GBK、GB2312)。
  • 性能:取决于本地编码转换器的实现。
  • 典型用途:跨平台兼容本地编码字符串。

cpp

QString str = QString::fromLocal8Bit("你好");


3. fromUtf8(const char *str, int size = -1)

  • 功能:将 UTF-8 编码的 C 字符串转换为 QString
  • 输入类型
    • UTF-8 编码的多字节字符集(支持完整的 Unicode 码点)。
  • 适用场景
    • UTF-8 编码的文本(现代标准,广泛用于网络和 Linux 系统)。
  • 支持中文:✅ 支持所有 Unicode 字符(包括中文、日文、韩文等)。
  • 性能:相对较慢,需解析多字节序列。
  • 典型用途:国际化应用、跨平台开发、读取网络数据。

cpp

QString str = QString::fromUtf8("你好");


4. fromUtf16(const ushort *utf16, int size = -1)

  • 功能:将 UTF-16 编码的字符串(以 ushort 数组表示)转换为 QString
  • 输入类型
    • UTF-16 编码的字符数组(每个字符用 2 字节表示)。
  • 适用场景
    • 处理 Windows API 返回的宽字符字符串(UTF-16LE)。
  • 支持中文:✅ 完整支持 Unicode。
  • 性能:较快,适合与 Windows 平台交互。
  • 典型用途:Windows 平台开发、与 COM 接口交互。

cpp

ushort utf16[] = {0x4F60, 0x597D}; // "你好"

QString str = QString::fromUtf16(utf16);


5. fromUcs4(const uint *ucs4, int size = -1)

  • 功能:将 UCS-4/UTF-32 编码的字符串(以 uint 数组表示)转换为 QString
  • 输入类型
    • UCS-4 编码的字符数组(每个字符用 4 字节表示)。
  • 适用场景
    • 处理纯 Unicode 码点数据,如某些协议定义的编码。
  • 支持中文:✅ 完整支持 Unicode。
  • 性能:较慢,需要转换 4 字节码点为 UTF-16。
  • 典型用途:与底层协议或特定编码格式交互。

cpp

uint ucs4[] = {0x4F60, 0x597D}; // "你好"

QString str = QString::fromUcs4(ucs4);


6. fromRawData(const QChar *unicode, int size)

  • 功能:从原始的 QChar 数组创建一个 QString,不复制数据,而是共享数据指针。
  • 输入类型
    • QChar 类型的字符数组。
  • 适用场景
    • 高效地从已有的 QChar 数据创建字符串,避免拷贝。
  • 支持中文:✅ 支持所有 Unicode 字符。
  • 性能:非常快,零拷贝。
  • 典型用途:性能敏感场景,如大量字符串拼接、缓存管理。

cpp

QChar data[] = {'H', 'e', 'l', 'l', 'o'}; QString str = QString::fromRawData(data, 5);


总结对比表

方法 输入编码 是否支持中文 是否推荐使用 典型用途
fromLatin1 Latin-1 西欧语言、ASCII 文本
fromLocal8Bit 本地编码 ✅(视平台) 本地编码字符串(如 Windows GBK)
fromUtf8 UTF-8 国际化应用、网络传输、通用文本
fromUtf16 UTF-16 Windows API、COM 接口
fromUcs4 UCS-4/UTF-32 特定协议、底层编码处理
fromRawData 原始 QChar 数组 ✅(性能敏感) 零拷贝、高效构造字符串

推荐用法

  • ✅ 优先使用 fromUtf8:适用于绝大多数现代开发场景,特别是跨平台和国际化项目。
  • ✅ fromUtf16 用于 Windows 开发:当与 Windows API 或 COM 交互时。
  • ✅ fromRawData 用于高性能场景:如构建临时字符串或缓冲区操作。
  • ⚠️ 避免使用 fromLocal8Bit 和 fromLatin1:除非你明确知道输入编码且无法控制输入源。

示例代码汇总


cpp

// fromLatin1: 仅限 ASCII 或西欧语言
QString s1 = QString::fromLatin1("Hello");

// fromLocal8Bit: 本地编码(如 Windows 中文系统)
QString s2 = QString::fromLocal8Bit("你好");

// fromUtf8: 最通用的方式
QString s3 = QString::fromUtf8("你好");

// fromUtf16: Windows 宽字符接口
ushort utf16[] = {0x4F60, 0x597D};
QString s4 = QString::fromUtf16(utf16);

// fromUcs4: 处理纯 Unicode 码点
uint ucs4[] = {0x4F60, 0x597D};
QString s5 = QString::fromUcs4(ucs4);

// fromRawData: 零拷贝构造
QChar raw[] = {'H', 'e', 'l', 'l', 'o'};
QString s6 = QString::fromRawData(raw, 5);

注意事项

  • 编码一致性:确保输入数据的实际编码与使用的函数一致,否则会导致乱码。
  • 性能权衡:对于性能要求高的场景,优先选择 fromUtf8 和 fromRawData
  • 跨平台兼容性fromUtf8 是最安全的选择,尤其在跨平台项目中。

在大多数情况下,推荐使用 QString::fromUtf8(),因为它具有广泛的兼容性和良好的性能表现,是最通用的解决方案。