[Development] QT_NO_CAST_FROM_ASCII for platformsupport

Thiago Macieira thiago.macieira at intel.com
Tue Feb 14 15:24:23 CET 2012


On terça-feira, 14 de fevereiro de 2012 15.03.34, Olivier Goffart wrote:
> On Tuesday 14 February 2012 13:50:06 Johannes Zellner wrote:
> > Hi,
> > 
> > what is the reason for " DEFINES += QT_NO_CAST_FROM_ASCII "
> > in the platformsupport.pro file?
> > 
> > I just hit that and would like to understand why we have this
> > inconvenience here.
> 
> Ok, i don't know the specific on why it is there in platform support. The
> rest of Qt just has QT_ASCII_CAST_WARNINGS

Actually, there are many parts of Qt with QT_NO_CAST_FROM_ASCII:

$ git grep QT_NO_CAST_FROM_ASCII -- mkspecs src/\*.pr? | cat
src/platformsupport/platformsupport.pro:DEFINES += QT_NO_CAST_FROM_ASCII
src/plugins/platforms/windows/windows.pro:DEFINES *= QT_NO_CAST_FROM_ASCII
src/plugins/sqldrivers/qsqldriverbase.pri:DEFINES += QT_NO_CAST_TO_ASCII 
QT_NO_CAST_FROM_ASCII
src/sql/sql.pro:DEFINES += QT_NO_CAST_FROM_ASCII
src/testlib/testlib.pro:    QT_NO_CAST_FROM_ASCII \
src/tools/bootstrap/bootstrap.pri:        QT_NO_CAST_FROM_ASCII \
src/tools/bootstrap/bootstrap.pro:        QT_NO_CAST_FROM_ASCII \

Having it enabled is a good reason because:

> Anyway, casting from char* to QString must be avoided on library code.
> 
> the reason:
> 
> if you have
> 
> QString foo = file.readAll();
> 
> This compile fine, and even look right, but might be wrong.
> because a char* do not say anything about the encoding. Is it latin1, utf8,
> other?
> 
> So Qt provide QTextCodec::codecForCString.

Not for long :-)

http://codereview.qt-project.org/14626


> There is also QTextCodec::codecForLocale used by QString::fromLocal8Bit.
> 
> For example, in a french programing team, you would have
> label->setText("Résultats Erronés");
> And this will probably be in latin1, because the file is saved as such on
> the disc. (and latin1 is faster than utf8).

And they'll have to recode their sources to UTF-8 with Qt 5, or add the 
wrapping QLatin1String.

> So if in your library you do
> QString foo = file.readAll();
> The result will depends on the application.

With Qt 5, it will not. It will be decoded using UTF-8, which is good and bad:

Good: because it's well-defined and you know what will happen.

Bad: because if you have binary data, UTF-8 cannot decode it. ISO-8859 can 
decode anything to Unicode, so it's idempotent in a round-trip. UTF-8 isn't, 
so if you mix QString and QByteArray by mistake, you might cause data 
corruption.

> So the rule is:
>  - Always be explicit about which encoding you import the string from.
>  - If it is a literal, use QStringLiteral in 95% of the case, and
> QLatin1String in most of th	e other cases.

We need to document when to use either.

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center
     Intel Sweden AB - Registration Number: 556189-6027
     Knarrarnäsgatan 15, 164 40 Kista, Stockholm, Sweden
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.qt-project.org/pipermail/development/attachments/20120214/aa157407/attachment.sig>


More information about the Development mailing list