QString相对于std::string有哪些优势?普通的std::string能否存储Unicode字符?我正在尝试编写一个可以打开各种歌曲文件的程序。这些文件的名称可能是不同的语言。我听说在这种情况下使用普通字符串将无法正常工作。我想让应用程序独立于QT并重用代码,例如在Android中。你有什么建议?
QString相对于std::string有哪些优势?普通的std::string能否存储Unicode字符?我正在尝试编写一个可以打开各种歌曲文件的程序。这些文件的名称可能是不同的语言。我听说在这种情况下使用普通字符串将无法正常工作。我想让应用程序独立于QT并重用代码,例如在Android中。你有什么建议?
std::string
只是按照你提供的字节存储它们,它不知道任何关于编码的信息。(这意味着,例如,length
是字节数而不是字符数) - Oleh PrypinQString
与std::string
存在完全相同的问题:它的大小也是UTF-16代码点的数量,而不是字符数。 - MSaltersstd::wstring
更糟糕。你不知道每个字符是2个字节还是4个字节,而且它也不能保证是Unicode。至少使用 std::string
,你知道每个字符是1个字节,并且你不会总是有 per-codepoint 访问 wstring(例如在Windows中,wchar_t
是2个字节)。 - Tim Čas如果你使用Qt框架编写软件,那么最好使用QString。简单的原因是几乎所有作用于字符串的Qt函数都能接受QString类型的参数。如果你使用std::string,则可能会遇到需要进行类型转换的情况。如果你的软件完全不使用Qt,考虑使用std::string,这样可以使代码更加可移植,并且不依赖于额外的框架,用户也不需要安装额外的框架才能使用你的软件。
QString
,但是std::string
的一个重要优点是它是标准的。关于Unicode,使用std::string
存储UTF-8没有问题;但是,根据您的需求,使用std::wstring
可能更好(通常会存储UTF-16或UTF-32)。QString
是一个合理的中间件。它没有提供完整的 ICU 功能,但它可以执行简单的任务,如从/到 UTF-8/16/32 的转换。 - MSaltersstd::string
实际上只是一个简单的容器,带有一些额外的函数来替换其中的一些 _字节_。它不知道字符或编码,更不用说与文本相关的任何内容了。如果您正在操作文本,则表示文本的类可能更合适。或者,作为替代方案,使用将 std::string
视为 UTF-8 文本的库。 - James Kanze从技术上讲,有一个标准字符串类来存储任何类型的字符: std::basic_string
。 std::string
和 std::wstring
只是char
和wchar
的std::basic_string
的特化。还有专门用于UTF-16和UTF-32存储的特殊化的std::u16string
和std::u32string
。
无论如何,如果您必须使用Qt,则QString
可能始终是比任何标准库字符串更好的选择,因为整个Qt框架都是为其设计的。
std::u16string
、std::u16string_view
和QStringView
,我们是否应该能够编写支持这三种类型的API,并传入{s.data(), s.size()}
? - Ben
QString
使用隐式共享/写时复制机制来获得良好的性能提升。 - cmannett85