Szukaj…


Uwagi

Język C ++ nie narzuca żadnego zestawu znaków, niektóre kompilatory mogą obsługiwać UTF-8, a nawet UTF-16. Jednak nie ma pewności, że zostanie dostarczone coś poza prostymi znakami ANSI / ASCII.

Dlatego cała obsługa języków międzynarodowych jest zdefiniowana implementacja, w zależności od używanej platformy, systemu operacyjnego i kompilatora.

Kilka bibliotek stron trzecich (takich jak Międzynarodowa Biblioteka Komitetu Unicode), których można użyć do rozszerzenia międzynarodowego wsparcia platformy.

Zrozumienie cech łańcucha 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;
}

W zależności od platformy (Windows, OSX itp.) I kompilatora (GCC, MSVC itp.), Ten program może się nie kompilować, wyświetlać różne wartości lub wyświetlać te same wartości .

Przykładowe dane wyjściowe w kompilatorze Microsoft MSVC:

Długość struny: 31
Długość struny: 31
CString Length: 24
CString Length: 24

To pokazuje, że w MSVC każdy z używanych znaków rozszerzonych jest uważany za pojedynczy „znak”, a ta platforma w pełni obsługuje języki międzynarodowe.
Należy jednak zauważyć, że takie zachowanie jest niezwykłe, te międzynarodowe znaki są przechowywane wewnętrznie jako Unicode, a zatem mają w rzeczywistości kilka bajtów. Może to powodować nieoczekiwane błędy

W kompilatorze GNC / GCC wyjściem programu jest:

Długość struny: 31
Długość struny: 36
CString Length: 24
CString Length: 26

Ten przykład pokazuje, że chociaż kompilator GCC używany na tej platformie (Linux) obsługuje te znaki rozszerzone, używa także ( poprawnie) kilku bajtów do przechowywania pojedynczego znaku.
W takim przypadku możliwe jest użycie znaków Unicode, ale programista musi bardzo uważać, aby pamiętać, że długość „łańcucha” w tym scenariuszu jest długością w bajtach , a nie długością w czytelnych znakach .

Różnice te wynikają z tego, w jaki sposób języki międzynarodowe są obsługiwane dla poszczególnych platform - a co ważniejsze, łańcuchy C i C ++ użyte w tym przykładzie można uznać za tablicę bajtów , tak że (dla tego zastosowania) język C ++ bierze pod uwagę znak (char), który ma być pojedynczym bajtem .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow