2012-06-14 15 views
20

¿Qué ventajas ofrece QString sobre std :: string? ¿Puede un estándar std :: string almacenar caracteres Unicode? Intento escribir un programa que abrirá varios archivos de canciones. El nombre de estos archivos puede estar en diferentes idiomas. He oído que usar una cuerda normal en tales casos no funcionará correctamente. Quiero mantener la aplicación independiente de QT y reutilizar el código, por ejemplo, en Android. Que sugieres .ventaja de QString en std :: string

+4

http://www.joelonsoftware.com/articles/Unicode.html – Arafangion

+0

Esto puede ayudar a responder parte de su pregunta http://stackoverflow.com/questions/6028093/unicode-stdstring-class-replacement – kenny

+0

@Arafangion : eso es la mitad de la diversión ... también debería agregar todo el lío sobre la codificación del sistema de archivos a la imagen – 6502

Respuesta

23

QString le permite trabajar con Unicode, tiene más métodos útiles y se integra bien con Qt. También tiene un mejor rendimiento, como cbamber85noted.

std::string almacena los bytes a medida que se los da, no sabe nada sobre codificaciones. Utiliza un byte por carácter, pero no es suficiente para todos los idiomas del mundo. La mejor manera de almacenar sus textos sería probablemente la codificación UTF-8, en la cual los caracteres pueden ocupar diferentes números de bytes, ¡y std::string simplemente no puede manejar eso correctamente! Esto, por ejemplo, significa que el método length devolverá el número de bytes, no los caracteres. Y esto es sólo la punta del iceberg ...

+0

Estoy buscando evitar cosas QT, ¿hay alguna otra salida? –

+0

Para ser justos, std :: string también le permite usar Unicode, aunque se concede, no significa que los datos estén en una codificación específica. ¿Quiere decir que QString permite conversiones Unicode? – Arafangion

+10

Vihaan, si estás tratando de evitar las cosas Qt, ¿por qué lo estás usando? Si tiene que hacer interfaz con componentes Qt, entonces usar QString hace su vida mucho más fácil. – Joey

6

No estoy familiarizado con QString, pero la gran ventaja de std::string es que es estándar. Con respecto a Unicode, no hay problema almacenando UTF-8 en un std::string; dependiendo de lo que esté haciendo, , sin embargo, podría ser mejor usar un std::wstring (que normalmente almacenará UTF-16 o UTF-32).

Para manipulaciones complejas de Unicode, sugeriría ICU. Pero para una gran cantidad de aplicaciones , basta con almacenar UTF-8.

+0

'QString' es un intermedio razonable. No ofrece una funcionalidad completa de la UCI, pero puede hacer cosas simples como conversiones de/a UTF-8/16/32 – MSalters

+0

+1 Cumplir con el estándar siempre es una ventaja. Guarde los tipos específicos de framework para los usos del framework. Me preguntaba, ¿qué ventajas daría una cadena UTF-16 o UTF-32 en el caso de Unicode frente a std :: string? – daramarak

+0

@daramarak Depende de lo que haga con las cadenas en el código. 'std :: string' en realidad no es mucho más que un simple contenedor, con algunas funciones adicionales para reemplazar algunos de los _bytes_ contenidos. No tiene conocimiento de caracteres o codificaciones, y mucho menos de nada relacionado con el texto. Si está manipulando texto, podría ser que una clase que represente texto sea más apropiada. O, como alternativa, una biblioteca que trate 'std :: string' como texto UTF-8. –

4

Técnicamente, hay una clase de cadena estándar para almacenar cualquier tipo de carácter: std::basic_string. std::string y std::wstring no son más que especializaciones de std::basic_string para char y wchar. También están las especializaciones std::u16string y std::u32string que están destinadas para el almacenamiento UTF-16 y UTF-32.

De todos modos, si tiene que trabajar con Qt, QString probablemente siempre sea una mejor alternativa que cualquier cadena de biblioteca estándar ya que todo el framework Qt está diseñado para funcionar con él.

7

Si está utilizando Qt framework para escribir su software, entonces es mejor utilizar QString. La razón simple es que casi todas las funciones de Qt que funcionan en cadenas aceptarán QString. Si usa std :: string, puede terminar en situaciones en las que tendrá que escribir de uno a otro. Debería considerar usar std :: string si su software no usa Qt en absoluto. Eso hará que su código sea más portátil y no dependa de un marco adicional que los usuarios deberán instalar para usar su software.

+3

El uso de un marco de trabajo no debe ser una razón para permitir que la biblioteca de marco impregne todo el código. La conversión en el límite ui es un pequeño precio a pagar para evitar el bloqueo del proveedor. – daramarak

+3

@daramarak Tiene razón, pero entonces Qt no es solo un marco de interfaz de usuario. Proporciona todo tipo de cosas que no son UI, como Networking, SQL, XML, Scripting, etc. De modo que dependiendo de qué tan extensamente uno esté usando el framework, uno puede atender una llamada. – Pankaj