Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

what's the difference between QString and QLatin1String?

Tags:

qt

Like the title

1.what's the difference between QString and QLatin1String??

2.when and where do I need to use one of them??

3.following:

QString str;
str = "";
str = QLatin1String("");

Is "" == QLatin1String("")??

like image 467
mac.ma Avatar asked Feb 22 '12 09:02

mac.ma


People also ask

What is QLatin1String?

QLatin1String is a thin wrapper for plain, 8-bit C string. QString is a Unicode-aware string. Under the hood, it stores data as 16-bit characters. QString is a bit more expensive to construct than QLatin1String because the data is larger ("Hello" takes up 5 bytes in QLatin1String, but 10 bytes in QString).

What is a QString?

QString stores unicode strings. By definition, since QString stores unicode, a QString knows what characters it's contents represent. This is in contrast to a C-style string (char*) that has no knowledge of encoding by itself.

How do you declare a QString?

One way to initialize a QString is simply to pass a const char * to its constructor. For example, the following code creates a QString of size 5 containing the data "Hello": QString str = "Hello"; QString converts the const char * data into Unicode using the fromAscii() function.


1 Answers

QString holds unicode. A string literal "foo" is a byte sequence that could contain text in any encoding. When assigning a string literal to a QString, QString str = "foo", you implicitely convert from a byte sequence in undefined encoding to a QString holding unicode. The QString(const char*) constructor assumes ASCII and will convert as if you typed QString str = QString::fromAscii("foo"). That would break if you use non-ascii literals in your source files (e.g., japanese string literals in UTF-8) or pass character data from a char* or QByteArray you read from elsewhere (a file, socket, etc.). Thus it's good practice to keep the unicode QString world and the byte array QByteArray/char* world separated and only convert between those two explicitly, clearly stating which encoding you want to use to convert between those two. One can define QT_NO_CAST_FROM_ASCII and QT_NO_CAST_TO_ASCII to enforce explicit conversions (I would always enable them when writing a parser of any sort). Now, to assign a latin1 string literal to a QString variable using explicit conversion, one can use

QString foo = QString::fromLatin1("föö");

or

QString foo = QLatin1String("föö");

Both state that the literal is encoded in latin1 and allow "encoding-safe" conversions to unicode. I find QLatin1String nicer to read and the QLatin1String docs explain why it will be also faster in some situations.

Wrapping string literals, or in some cases QByteArray or char* variables, holding latin1 data for conversion is the main use for QLatin1String, one wouldn't use QLatin1String as method arguments, member variables or temporaries (all QString).

like image 69
Frank Osterfeld Avatar answered Oct 21 '22 05:10

Frank Osterfeld