2012-09-03 26 views
10

Estoy feliz de ver std::u16string y std::u32string en C++ 11, pero me pregunto por qué no hay std::u8string para manejar el caso UTF-8. Tengo la impresión de que std::string está destinado para UTF-8, pero parece que no lo hace muy bien. Lo que quiero decir es, ¿std::string.length() aún no devuelve el tamaño del búfer de la cadena en lugar del número de caracteres en la cadena?std :: u16string, std :: u32string, std :: cadena, longitud(), tamaño(), puntos de código y caracteres

Entonces, ¿cómo se define el método length() de las cadenas estándar para las nuevas clases de C++ 11? ¿Devuelven el tamaño del búfer de la cuerda, el número de puntos de código o el número de caracteres (suponiendo que un par suplente tenga 2 puntos de código, pero un carácter. Corrígeme si me equivoco)?

Y qué tal size(); ¿No es igual a length()? Ver http://en.cppreference.com/w/cpp/string/basic_string/length para la fuente de mi confusión.

lo tanto, supongo, mi pregunta fundamental es cómo lo hace un uso std::string, std::u16string y std::u32string y distinguir correctamente entre el tamaño del búfer, el número de puntos de código, y el número de caracteres? Si usa los iteradores estándar, ¿itera sobre bytes, puntos de código o caracteres?

+3

'std :: string' funciona igual para utf8 que' u16string' para utf16: maneja elementos del tipo correspondiente, y no trata con caracteres que están representados por una secuencia de más de un elemento. –

+0

Vaya aquí: http://utf8everywhere.org/#myth.strlen –

Respuesta

15

y u32string no son "nuevas clases de C++ 11". Solo son typedefs de std::basic_string para char16_t y cha32_t tipos.

length es siempre igual a size para cualquier basic_string. Es el número de T en la cadena, donde T es el tipo de plantilla para basic_string.

basic_string no es consciente de Unicode de ninguna manera, forma o forma. No tiene ningún concepto de puntos de código, grafemas, caracteres Unicode, normalización Unicode ni nada por el estilo. Es simplemente una secuencia ordenada de T s. Lo único que tiene conocimiento de Unicode sobre u16string y u32string es que usan el tipo devuelto por los literales u"" y U"". Por lo tanto, pueden almacenar cadenas codificadas en Unicode, pero no hacen nada que requiera el conocimiento de dicha codificación.

Iteradores iterar sobre los elementos de T, no "bytes, puntos de código o caracteres". Si T es char16_t, repetirá más de char16_t s. Si la cadena está codificada en UTF-16, está iterando sobre las unidades de código UTF-16, no sobre los puntos de código Unicode o sobre los bytes.

+4

En la terminología Unicode, 'T' = la" unidad de código ". – dan04

+1

Y * unidad de código *! = * Punto de código *. Son dos conceptos diferentes. Solo para referencia posterior porque no sabía eso ... – Eonil

1

Todos los tipos de cadenas hacen lo mismo: tienen una secuencia de elementos, cada uno de los cuales es del tipo de caracteres para la cadena. length() y size() ambos devuelven la cantidad de elementos. Iteradores iterador sobre elementos. El análisis de alto nivel, como calcular el número de caracteres, requiere cálculos mucho más complejos.

0

Actualmente no hay nada integrado en el estándar para distinguir entre unidades de código, puntos de código o bytes individuales. Sin embargo, parece que hay algunas cosas en los trabajos para tratar con this sort of thing. Dependiendo de lo que el comité de normas decida, puede ser parte de TR2 o el próximo estándar.

Cuestiones relacionadas