2012-02-22 15 views

Respuesta

11

QString contiene Unicode. Un literal de cadena "foo" es una secuencia de bytes que podría contener texto en cualquier codificación. Al asignar un literal de cadena a un QString, QString str = "foo", convierte implícitamente de una secuencia de bytes en codificación indefinida a un QString que contiene unicode. El constructor QString (const char *) asume ASCII y se convertirá como si hubiera escrito QString str = QString::fromAscii("foo"). Eso se rompería si usa literales que no sean ASCII en sus archivos fuente (por ejemplo, literales de cadenas japonesas en UTF-8) o pase datos de caracteres de un char * o QByteArray que lea de otro lado (un archivo, socket, etc.). Por lo tanto, es una buena práctica mantener el mundo Unicode QString y el conjunto de bytes QByteArray/char * separados por el mundo y solo convierta entre esos dos explícitamente, indicando qué codificación desea usar para convertir entre esos dos. Uno puede definir QT_NO_CAST_FROM_ASCII y QT_NO_CAST_TO_ASCII para imponer conversiones explícitas (siempre los habilitaría al escribir un analizador de cualquier tipo). Ahora, para asignar una cadena latin1 literal a una variable QString usando conversión explícita, se puede utilizar

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

o

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

Tanto estado en que el literal está codificado en latin1 y permitir "encoding-safe "conversiones a Unicode". Encuentro que QLatin1String es más agradable de leer y el QLatin1String docs explica por qué también será más rápido en algunas situaciones.

Envolviendo literales de cadena, o en algunos casos variables QByteArray o char *, manteniendo los datos de latin1 para la conversión es el uso principal de QLatin1String, uno no usaría QLatin1String como argumentos de método, variables de miembro o temporales (todos QString).

+0

"porque no construye cuatro objetos QString temporales y hace una copia profunda de los datos del carácter." (De QLatin1String docs), entonces, no "QString QString :: fromAscii (const char * str, int size = -1) "construir un objeto", ¿por qué? –

+1

Ese razonamiento se ve raro de hecho. Mirando la implementación, operator == (const char *) y == QString :: fromAscii/Latin1 ambos construyen un QString completo, mientras que == QLatin1String no lo hace. –

Cuestiones relacionadas