2010-10-23 4 views
3

Salutations,encodage des caractères problème

Je développe un projet en C++ où je veux utiliser des caractères comme á é õ et ┌ ─ ┐ │ pour dessiner quelques images agréables. Mon doute réside dans ce que je devrais changer dans mes paramètres de code/projet puisque, sans aucune sorte de modifications, la console imprime juste des caractères pseudo-aléatoires.

Je sais que les caractères ci-dessus sont définis dans le jeu de caractères Code page 437 aka ASCII étendu, mais ce que je devrais faire savoir?

Après quelques recherches, j'ai inclus l'instruction setlocale(LC_CTYPE, ""); et maintenant je peux imprimer des caractères accentués (à é õ) mais je ne peux pas imprimer les bordures.

Aussi, dois-je utiliser char et string ou wchar et wstring utiliser ces caractères?

Merci

+0

Votre application utilise peut-être un service local spécifique. Mais quel encodage local/caractère est utilisé par le terminal pour afficher les caractères? –

Répondre

2

Je pense que la meilleure façon de le faire serait d'utiliser wchar et wstring pour les personnages - ils sont destinés à des opérations de chaîne locale-indépendante et sont définis comme UTF-16 dans Windows et comme UTF- 32 sous Linux.

Notez que vous devez utiliser les fonctions appropriées, par exemple wprintf au lieu de printf ... Si vous utilisez iostream, je pense que cela devrait fonctionner hors-the-box avec wstrings.

EDIT: Notez qu'il n'est pas nécessaire que wchar_t soit unicode (en pratique, c'est souvent le cas). Si wchar_t (et donc, wstring) est unicode, alors le standard C99 (et par conséquent le plus probablement le standard C++) indique que __STDC_ISO_10646__ doit être défini.

En d'autres termes, si __STDC_ISO_10646__ est défini, le wchar_t est unicode - comme pour le type exact (UTF-16 ou UTF-32), vous pouvez utiliser un sizeof (wchar_t).

+0

En C++ (qui est basé sur C89, pas C99), le codage de 'wchar_t' et' std :: wstring' est un détail d'implémentation, bien que ce que vous énoncez pour Windows/Linux soit le cas le plus courant. Pour le flux IO, utilisez 'std :: wcout',' std :: wcin' etc. – sbi

+0

J'ai enlevé le 'setlocale (LC_CTYPE," ");' car wchar et wstring sont indépendants de la locale. Mais maintenant, le compilateur renvoie l'erreur 'conversion en jeu de caractères d'exécution: séquence d'octets illégaux' avec des opérations comme' std :: wstring maintenance = L "Manutenção"; 'Que se passe-t-il? –

+0

@sbi: Même chose pour C99, il dépend de l'implémentation - mais, comme je l'ai dit, '__STDC_ISO_10646__' est défini si wchar_t correspond à une forme d'Unicode. –

0

Pour voir quels caractères Unicode pour utiliser et rechercher des http://unicode.org/charts/ Rechercher « Dessin ». Cet ensemble inclut les caractères qui sont dans CP 437, mais aussi beaucoup d'autres. La prochaine question est de savoir si votre appareil peut afficher tout ou partie de ceux-ci.