C++
Internacjonalizacja w C ++
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 .