2010-05-18 9 views
2

Je travaille sur une librairie de chaînes c + + qui a 4 classes principales qui traitent les chaînes ASCII, UTF8, UTF16, UTF32, chaque classe a une fonction Print qui formate une chaîne d'entrée et affiche le résultat dans stdout ou stderr . mon problème est que je ne sais pas quel est le codage de caractères par défaut pour ces flux.Codage des caractères stdout et stderr

pour l'instant mes classes fonctionnent sous Windows, plus tard je vais ajouter le support pour mac et linux donc si vous savez quelque chose sur ces codage de flux, je vais l'apprécier. Donc ma question est: quel est le codage par défaut pour stdout et stderr et puis-je changer cet encodage plus tard et si oui, que se passerait-il aux données stockées là?

merci.

Répondre

3

stdout et l'utilisation stderr locale « C ». "C" locale est netural, et dans la plupart des systèmes traduits dans les paramètres régionaux de l'utilisateur actuel. Vous pouvez forcer le programme à utiliser un lieu spécifique en utilisant la fonction setlocale:

// Set all categories and return "English_USA.1252" 
setlocale(LC_ALL, "English"); 
// Set only the LC_MONETARY category and return "French_France.1252" 
setlocale(LC_MONETARY, "French"); 
setlocale(LC_ALL, NULL); 

Les chaînes de paramètres régionaux pris en charge sont spécifiques système et compilateur. Seuls "C" et "" doivent être pris en charge.

http://www.cplusplus.com/reference/clibrary/clocale/

+0

donc vous voulez dire que les flux standards utilisent les paramètres régionaux actuels du système? Je pense que selon ce que vous avez dit que mes classes devraient détecter quelle page de code actuelle le système utilise et dépend de ce qu'il écrit les données de chaîne. qu'est-ce qui s'est passé pour diffuser des données si le codage a changé? –

0

Vous pouvez jeter un oeil à this SO answer (réponse la plus mise à jour).

Ce n'est pas exactement votre question, mais elle est certainement liée et donne beaucoup d'informations utiles.

Je ne suis pas expert, mais je pense que nous pouvons supposer que vous devez utiliser std::cout chaque fois que vous utilisez std::string et std::wcout chaque fois que vous utilisez std::wstring.

+0

vous avez raison cependant je ne suis pas en utilisant la chaîne ou wstring j'ai mes propres classes de cordes et chacun a sa représentation interne et que je ne peux pas utiliser ou Cout wcout pour imprimer au flux stdout . –

+0

Je pourrais manquer quelque chose mais ... les standards 'std :: string' et' std :: wstring' ne couvrent-ils pas tous les encodages possibles? Avez-vous * vraiment * besoin de créer vos propres classes de chaînes? – ereOn

+1

ce n'est pas seulement l'encodage, il y a trop de raisons qui m'ont fait créer mes propres classes de chaînes, par exemple dans mes classes j'utilise mmx pour copier et rechercher, référence pas à la mémoire wast en passant par valeur (parfois je dois), codage de hachage pour les chaînes et beaucoup d'autres. en fait, je suis sur le point d'être fini à partir des classes ASCII, UTF8 mais maintenant je suis coincé à la fonction d'impression. –

Questions connexes