QString的目的是什么?

3
我是C++和Qt的新手。我用Qt Creator玩了几天,让我印象深刻的是GUI组件只接受const QString&而不是stringstd::wstring。为了保持一致,我一直尝试从大多数函数调用中接收和返回QString,然而我发现自己经常需要转换为std::string以使用大多数标准库设施。
我的问题是,如果std::string是标准库的一部分,那么QString有什么作用呢?我猜这对于已经使用Qt并且不想依赖于#include <string>的人会很有好处,但老实说,如果您想在应用程序中做任何有用的事情,你将需要std::string。(特别是对于QChar,因为char是内置类型。)
有人能解释一下这不是重复造轮子的原因以及如何帮助实现跨平台吗?

一个原因可能是 Qt 使用 UTF-8 文本格式,而 std::string 不支持 UTF-8。也就是说,您可以将 UTF-8 字符串存储在 std::string 中,但如果尝试使用 std::string 的迭代器迭代该字符串,则会迭代字节而不是字符,这通常不是您想要的。 - Jeremy Friesner
@JeremyFriesner 没错,但我们已经有了 std::wstringwchar_t(我相信是UTF-16),所以我不认为这足以证明需要创建一个全新的字符串类。 - James Ko
Utf-16和utf-8是不同的编码方式。 Utf-8能够进行一些utf-16无法完成的操作。 - Jeremy Friesner
1
std::string是那些在课堂外就毫无意义的东西之一。它完全不可移植,如果你想做除了简单地保存字符串以外的任何事情,它就没有用处了。std::string是C++标准化努力的一个不太成功的产物。就像其他C++容器一样非常好用,但是字符串却没什么用处。如果你正在从C的strxxx函数进行移植,那么使用它还是有意义的,但也仅限于此。 - Kuba hasn't forgotten Monica
Kuba,当你说不可移植时,是指在计算机体系结构之间不可移植,还是指在使用不同人类语言时不可移植? - Jeremy Friesner
2个回答

7
我在这里的问题是,如果std::string是标准库的一部分,那么QString的目的是什么?
我能想到的原因有:
  1. QStringstd::string早在Qt库中出现。

  2. 它的接口包括很多Qt特定的类。因此,QString的使用不能轻易地被std::string替代。

  3. 它的接口比std::string更丰富。


啊,基本上是为了兼容性和可用性的原因。我猜QChar也是出于同样的原因吧?char自语言问世以来就一直存在。 - James Ko
1
QChar不仅仅是char。 - drescherjm
@JamesKo Qt注重可移植性,Qt推荐使用的char版本是qint8。至于QChar,“QChar类提供了一个16位Unicode字符”,它甚至不同于char。 - mikag
@mikag 这是不准确的。QChar 表示 Unicode 代码单元,而不是代码点!“16 位 Unicode 字符”这个短语是无意义的,因为在 Unicode 中,字符有一个非常具体的含义,而“16 位”修饰符并不适用于它。 - Kuba hasn't forgotten Monica
@KubaOber 很有趣。我可能应该添加源引用,但我无法在评论中找到正确的链接格式。我的错。但是那句话直接来自Qt QChar文档... - mikag
@mikag 您可以随时提交文档更新来修复这个问题 :) - Kuba hasn't forgotten Monica

6
QString相对于std::string的一个优势是更易编写独立于平台的代码。针对Unicode支持,大部分平台使用UTF-8编码,而Windows使用UTF-16编码。同时,虽然在所有平台上char的大小相同,但wchar_t的大小不同,在std::wstring中字符的大小会因平台而异。 QString通过在所有平台上使用UTF-16编码消除了这种混淆。如果需要与特定于平台的代码进行交互,QString提供了转换为和从UTF-8、UTF-32、本机std类型等的辅助方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接