Buscar..


Observaciones

El lenguaje C ++ no dicta ningún conjunto de caracteres, algunos compiladores pueden admitir el uso de UTF-8, o incluso de UTF-16. Sin embargo, no hay certeza de que se proporcione algo más que simples caracteres ANSI / ASCII.

Por lo tanto, toda la compatibilidad con idiomas internacionales está definida por la implementación, y depende de qué plataforma, sistema operativo y compilador esté utilizando.

Varias bibliotecas de terceros (como la Biblioteca del Comité Internacional de Unicode) que pueden utilizarse para ampliar el soporte internacional de la plataforma.

Entendiendo las características de la cadena C ++

#include <iostream>
#include <string>

int main()
{
    const char * C_String = "This is a line of text w";
    const char * C_Problem_String = "This is a line of text ኚ";
    std::string Std_String("This is a second line of text w");
    std::string Std_Problem_String("This is a second line of ϯϵxϯ ኚ");

    std::cout << "String Length: " << Std_String.length() << '\n';
    std::cout << "String Length: " << Std_Problem_String.length() << '\n';

    std::cout << "CString Length: " << strlen(C_String) << '\n';
    std::cout << "CString Length: " << strlen(C_Problem_String) << '\n';
    return 0;
}

Según la plataforma (Windows, OSX, etc.) y el compilador (GCC, MSVC, etc.), este programa puede no compilar, mostrar diferentes valores o mostrar los mismos valores .

Ejemplo de salida bajo el compilador de Microsoft MSVC:

Longitud de la cuerda: 31
Longitud de la cuerda: 31
Longitud CString: 24
Longitud CString: 24

Esto muestra que bajo MSVC cada uno de los caracteres extendidos utilizados se considera un "carácter" único, y esta plataforma es totalmente compatible con los idiomas internacionalizados.
Sin embargo, debe tenerse en cuenta que este comportamiento es inusual, estos caracteres internacionales se almacenan internamente como Unicode y, por lo tanto, tienen varios bytes de longitud. Esto puede causar errores inesperados.

Bajo el compilador GNC / GCC la salida del programa es:

Longitud de la cuerda: 31
Longitud de la cuerda: 36
Longitud CString: 24
Longitud CString: 26

Este ejemplo demuestra que si bien el compilador GCC utilizado en esta plataforma (Linux) admite estos caracteres extendidos, también usa ( correctamente) varios bytes para almacenar un carácter individual.
En este caso, es posible el uso de caracteres Unicode, pero el programador debe tener mucho cuidado al recordar que la longitud de una "cadena" en este escenario es la longitud en bytes , no la longitud en caracteres legibles .

Estas diferencias se deben a la forma en que se manejan los idiomas internacionales por plataforma y, lo que es más importante, que las cadenas C y C ++ utilizadas en este ejemplo pueden considerarse una matriz de bytes , por lo que (para este uso) el lenguaje C ++ considera Un carácter (char) para ser un solo byte .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow