Me he dado cuenta de que el método de longitud de std :: string devuelve la longitud en bytes y el mismo método en std :: u16string devuelve el número de secuencias de 2 bytes.Con C++ 11, ¿todavía necesito una biblioteca de manipulación de cadenas no estándar para texto Unicode?
También he notado que cuando un personaje o punto de código se encuentra fuera de la BMP, longitud devuelve 4 en lugar de 2.
Por otra parte, la secuencia de escape Unicode se limita a \ unnnn, por lo que cualquier punto de código anterior U + FFFF no puede ser insertado por una secuencia de escape.
En otras palabras, no parece haber soporte para pares de sustitución o puntos de código fuera del BMP.
Dado esto, ¿es la práctica recomendada o aceptada utilizar una biblioteca de manipulación de cadenas no estándar que comprenda UTF-8, UTF-16, pares de sustitución, etc.?
¿Mi compilador tiene un error o estoy utilizando los métodos estándar de manipulación de cadenas incorrectamente?
Ejemplo:
/*
* Example with the Unicode code points U+0041, U+4061, U+10196 and U+10197
*/
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
std::string example1 = u8"A䁡";
std::u16string example2 = u"A䁡";
std::cout << "Escape Example: " << "\u0041\u4061\u10196\u10197" << "\n";
std::cout << "Example: " << example1 << "\n";
std::cout << "std::string Example length: " << example1.length() << "\n";
std::cout << "std::u16string Example length: " << example2.length() << "\n";
return 0;
}
Este es el resultado que obtengo cuando compilado con GCC 4.7:
Escape Example: A䁡မ6မ7
Example: A䁡
std::string Example length: 12
std::u16string Example length: 6
Gracias por la respuesta. También estoy interesado en otros métodos de manipulación de cadenas como substr y cómo manejan UTF-8, UTF-16, pares de sustitución, etc. Debería haber sido más claro. Utilicé la longitud porque era el ejemplo más fácil de publicar. –
@Ragsdale 30 cal Derecha. Supongo que tendremos que aceptar que todos estos métodos operan en unidades de código, no en caracteres, a pesar de las descripciones algo engañosas. Los iteradores son otro buen ejemplo. – jogojapan
Entonces, en otras palabras, ¿la única manera estándar de trabajar con Unicode es convertir texto a UTF-32 y usar std :: u32string? Eso parece un desperdicio. –