QString 和 std::string 的区别
Difference between QString and std::string
QString 和 std::string 有什么区别
为什么我不能说:
QString name;
std::string name1;
name = name1;
虽然都是字符串
提前致谢,抱歉我的英语不好
QString
是 Qt 框架自己的字符串库实现,而 std::string
是字符串的实现,它与其他 C/C++ 库捆绑在一起,例如 [=12] =], stdio 等
您可以进一步阅读 QString
here
编译器将如何推断 "both are strings" 以及如何将一个转换为另一个?
虽然这两个 类 都表示字符串,但它们仍然 不同,不相关 类。除非明确说明(如适当的转换运算符或构造函数),否则它们不能从一个转换为另一个,就像您不能使用简单的赋值将 std::vector<int>
转换为 std::list<int>
.
QString
有一个静态方法 fromStdString
可以为你工作:
name = QString.fromStdString(name1);
请注意,它期望 std::string
包含 utf-8 数据。
与 C#、Java 和其他语言不同,C++ 语言 中没有原生字符串类型。当您在源代码中键入 "abc"
之类的字符串文字时,编译器会将它们转换为 char 类型的数组,最后带有一个零值元素(形成 well-已知 'zero-terminated string' 值);
为了让开发人员的生活更轻松,C++ 包含一个标准库 class 用于字符串 (std::string),但这只是处理零终止字符数组的一种实现。 QString 是另一种实现。当然,还有数百个由开发人员根据自己的需要编写的。
所以你不能直接从一个赋值给另一个的原因是它们是完全不同的类型——编译器不知道两者都用于操作字符串——它只是将它们视为独立的、不兼容的classes.
区别在于它们是不同的。除非 QString
的设计者提供了一个接受 const std::string &
参数的赋值运算符,但他们没有这样做。
要从 std::string
获得 QString
,您需要使用 QString::fromStdString
,并且假设 std::string
是 UTF-8 编码的,则转换完成。您不能盲目地假设这是一个有效的假设:您必须了解您的 std::string
来自哪里以及它的编码方式。
您不能将一个分配给另一个,因为它不是一个廉价的操作,您需要提供一些信息,至少,std::string
中使用的编码是什么。回想一下 QString
存储 UTF-16 Unicode 代码单元。它不直接存储 Unicode 字符,QChar
确实用词不当:它不是字符,而是 UTF-16 代码单元( 不是 代码点)。有时,当一个字符恰好具有单单元 UTF-16 编码时,事情就解决了 "nicely",但这只是巧合。
std::string
更糟:它对其编码一无所知,它只是一些字符的向量。这使得它在许多您真正关心这些字符含义的应用程序中几乎毫无用处。
QString 和 std::string 有什么区别 为什么我不能说:
QString name;
std::string name1;
name = name1;
虽然都是字符串
提前致谢,抱歉我的英语不好
QString
是 Qt 框架自己的字符串库实现,而 std::string
是字符串的实现,它与其他 C/C++ 库捆绑在一起,例如 [=12] =], stdio 等
您可以进一步阅读 QString
here
编译器将如何推断 "both are strings" 以及如何将一个转换为另一个?
虽然这两个 类 都表示字符串,但它们仍然 不同,不相关 类。除非明确说明(如适当的转换运算符或构造函数),否则它们不能从一个转换为另一个,就像您不能使用简单的赋值将 std::vector<int>
转换为 std::list<int>
.
QString
有一个静态方法 fromStdString
可以为你工作:
name = QString.fromStdString(name1);
请注意,它期望 std::string
包含 utf-8 数据。
与 C#、Java 和其他语言不同,C++ 语言 中没有原生字符串类型。当您在源代码中键入 "abc"
之类的字符串文字时,编译器会将它们转换为 char 类型的数组,最后带有一个零值元素(形成 well-已知 'zero-terminated string' 值);
为了让开发人员的生活更轻松,C++ 包含一个标准库 class 用于字符串 (std::string),但这只是处理零终止字符数组的一种实现。 QString 是另一种实现。当然,还有数百个由开发人员根据自己的需要编写的。
所以你不能直接从一个赋值给另一个的原因是它们是完全不同的类型——编译器不知道两者都用于操作字符串——它只是将它们视为独立的、不兼容的classes.
区别在于它们是不同的。除非 QString
的设计者提供了一个接受 const std::string &
参数的赋值运算符,但他们没有这样做。
要从 std::string
获得 QString
,您需要使用 QString::fromStdString
,并且假设 std::string
是 UTF-8 编码的,则转换完成。您不能盲目地假设这是一个有效的假设:您必须了解您的 std::string
来自哪里以及它的编码方式。
您不能将一个分配给另一个,因为它不是一个廉价的操作,您需要提供一些信息,至少,std::string
中使用的编码是什么。回想一下 QString
存储 UTF-16 Unicode 代码单元。它不直接存储 Unicode 字符,QChar
确实用词不当:它不是字符,而是 UTF-16 代码单元( 不是 代码点)。有时,当一个字符恰好具有单单元 UTF-16 编码时,事情就解决了 "nicely",但这只是巧合。
std::string
更糟:它对其编码一无所知,它只是一些字符的向量。这使得它在许多您真正关心这些字符含义的应用程序中几乎毫无用处。