2009-09-29 6 views
8

¿Cuál es el mejor tipo, en C++, para almacenar cadenas UTF-8? Me gustaría evitar rodar mi propia clase si es posible.¿Mejor tipo para datos UTF-8?

Mi pensamiento original era std::string - sin embargo, esto usa char como el tipo subyacente. char puede estar sin firmar o firmado; varía. En mi sistema, está firmado. Sin embargo, las unidades de código UTF-8 son sin signo octetos. Esto parece indicar que es el tipo equivocado.

Esto nos lleva a std::basic_string<unsigned char> - que parece encajar en la factura: sin signo, de 8 bits (o más grande).

Sin embargo, la mayoría de las cosas parecen usar char. glib, por ejemplo, usa char. El uso de C++ ostreamchar.

¿Pensamientos?

Respuesta

9

Solo usaría std :: string, ya que es consistente con el UTF-8 ideal para tratar los datos tal como lo haría con cadenas ASCII terminadas en nulo a menos que realmente necesite su unicode-ness.

También me gusta la aplicación Glib :: ustring de GTKmm, pero eso solo funciona si está escribiendo una aplicación GTKmm (o al menos Glibmm).

+4

El único problema real con el uso de std :: string es que algunos operadores que se espera que trabajen en caracteres en realidad podrían terminar lidiando con caracteres parciales ya que UTF-8 es una codificación multibyte. Por ejemplo, usar el operador [] se rompería para que los "caracteres" además de la longitud de la cuerda no sean accesibles directamente. (El tamaño está disponible, pero no la longitud). –

+0

Solo necesita pensar que una cadena es una matriz de unidades de código en lugar de una matriz de caracteres. Entonces las únicas funciones miembro de 'cadena' que no funcionan son aquellas como 'find_one_of' que toma un conjunto de caracteres como argumento. – dan04

+2

@Evan: la definición de "caracteres" y "longitud" es tan compleja en Unicode (debido a la combinación y ligaduras y demás), que nunca será accesible directamente. Es mejor no pretender que lo son. –

7

Siempre he usado std :: string, de alguna manera, la pregunta filosófica "firmado" vs "sin firmar" casi nunca aparece como problemática en dicho contexto (codificadores y decodificadores hacia/desde UTF- 8 son cosas que solo se escriben raramente, después de todo, en el contexto de una aplicación, ¡simplemente se usa std :: string como una "caja negra"!).

4

UTF-8 es un de longitud variable codificación de caracteres. std::basic_string solo admite codificaciones de caracteres de longitud fija. Si necesita admitir codificaciones de longitud variable, puede intentar ICU4C library.

La UCI es un conjunto maduro y ampliamente utilizado de bibliotecas C/C++ y Java que proporcionan compatibilidad con Unicode y Globalización para aplicaciones de software. La ICU es ampliamente portátil y brinda a las aplicaciones los mismos resultados en todas las plataformas y entre C/C++ y el software Java.

Si necesita simplemente para almacenar cadena UTF-8 lo recomiendo a utilizar std::vector<char>. Esto indicará que no puede realizar operaciones de cadena reales (que podrían ser incorrectas) en los datos almacenados.

Cuestiones relacionadas