C++
Internationalisering in C ++
Zoeken…
Opmerkingen
De taal C ++ dicteert geen tekenset, sommige compilers ondersteunen mogelijk het gebruik van UTF-8 of zelfs UTF-16. Er is echter geen zekerheid dat er verder dan eenvoudige ANSI / ASCII-tekens worden verstrekt.
Alle internationale taalondersteuning is dus geïmplementeerd, afhankelijk van welk platform, besturingssysteem en compiler u mogelijk gebruikt.
Verschillende externe bibliotheken (zoals de International Unicode Committee Library) die kunnen worden gebruikt om de internationale ondersteuning van het platform uit te breiden.
C ++ string-kenmerken begrijpen
#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;
}
Afhankelijk van het platform (Windows, OSX, enz.) En compiler (GCC, MSVC, enz.), Kan dit programma mogelijk niet compileren, verschillende waarden weergeven of dezelfde waarden weergeven .
Voorbeelduitvoer onder de Microsoft MSVC-compiler:
Stringlengte: 31
Stringlengte: 31
CString-lengte: 24
CString-lengte: 24
Dit laat zien dat onder MSVC elk van de gebruikte uitgebreide tekens als één "teken" wordt beschouwd, en dit platform ondersteunt volledig geïnternationaliseerde talen.
Er moet echter worden opgemerkt dat dit gedrag ongebruikelijk is, deze internationale tekens worden intern opgeslagen als Unicode en zijn dus eigenlijk meerdere bytes lang. Dit kan onverwachte fouten veroorzaken
Onder de GNC / GCC-compiler is de programma-uitvoer:
Stringlengte: 31
Stringlengte: 36
CString-lengte: 24
CString-lengte: 26
Dit voorbeeld toont aan dat hoewel de GCC-compiler die op dit (Linux) platform wordt gebruikt deze uitgebreide tekens ondersteunt, deze ook ( correct) meerdere bytes gebruikt om een individueel karakter op te slaan.
In dit geval is het gebruik van Unicode-tekens mogelijk, maar de programmeur moet er goed op letten dat de lengte van een "string" in dit scenario de lengte in bytes is , niet de lengte in leesbare tekens .
Deze verschillen zijn te wijten aan de manier waarop internationale talen per platform worden behandeld - en nog belangrijker, dat de C- en C ++ -reeksen die in dit voorbeeld worden gebruikt als een reeks bytes kunnen worden beschouwd, zodat (voor dit gebruik) de C ++ -taal een karakter (char) als een enkele byte .