La tradition C et C++ est de prendre le concept de caractère en un sens américain, sans considérer (du moins pas de manière portable) les accents et les symboles alphabétiques propres à d'autres langues que l'anglais.
Le langage Java, un langage commercialisé dans les années '90, et les langages .NET (enfants du XXIe siècle), ont intégré plus directement les considérations d'internationalisation et l'importance incontournable d'Internet en offrant un support indigène au (très complexe) standard Unicode.
Voir cet article pour des exemples de conversion d'un format à un autre.
De plus en plus, le code C++ doit aussi se mettre à la page. Bien que la tradition (et la plupart des manuels) utilisent les types char, char* et std::string pour représenter des caractères ou des chaînes de caractères, il se trouve que C++ (tout comme C d'ailleurs) supporte depuis longtemps les caractères étendus à l'aide du type primitif wchar_t.
Étant donné que de plus en plus de bibliothèques ont recours à des caractères étendus et que plusieurs de mes étudiant(e)s en sont à leur premier contact avec les notations de caractères étendus en C++, j'ai décidé de mettre sur cette petite page un résumé des choses qui me semble les plus essentielles à connaître pour... disons pour passer au monde moderne.
Caractères traditionnels | Caractères étendus | Remarque |
|
|
Il suffit de préfixer un littéral char par L pour en faire un littéral wchar_t. |
|
|
Il suffit de préfixer un littéral char* par L pour en faire un littéral wchar_t*. |
|
|
Rien à changer. |
|
|
Le type std::string et le type std::wstring sont identiques à ceci près que std::string utilise des char comme représentation interne et que std::wstring utilise plutôt des wchar_t. |
|
|
Les objets std::cout et std::wcout sont identiques au type de caractère sous-jacent près. |
|
|
Les objets std::cin et std::wcin sont identiques au type de caractère sous-jacent près. La fonction std::getline() a le même comportement peu importe le type de flux en entrée (vive la programmation générique!) |
|
|
Il en va de std::cerr/ std::wcerr et de std::clog/ std::wclog comme il en va de std::cin/ std::wcin et de std::cout/ std::wcout. |