2010-06-17 14 views
26

Je me demande ce que la communauté Stack Overflow pense quand il s'agit de créer un projet (en pensant principalement C++ ici) avec un jeu de caractères unicode ou multi-octets.Type de projet C++: unicode vs multi-octets; Avantages et inconvénients

  • Y at-il des avantages pour aller Unicode droit dès le début, ce qui implique tous vos chaînes seront en grand format? Existe-t-il des problèmes de performances ou des besoins en mémoire plus importants en raison d'une utilisation standard d'un caractère plus grand?

  • Y at-il un avantage à cette méthode? Est-ce que certaines architectures de processeur traitent mieux les caractères larges?

  • Y a-t-il des raisons de faire votre projet Unicode si vous ne prévoyez pas sur prenant en charge d'autres langues? Quelles seraient les raisons de créer un projet avec un jeu de caractères multi-octets?

  • Comment tous les facteurs ci-dessus entrent en collision dans un environnement de haute performance (tel qu'un jeu vidéo moderne)?

+2

semble un peu subjectif, aussi beaucoup comme une question qu'un professeur donnerait. À savoir ces parties: Quelles raisons aurait-on pour créer un projet avec un jeu de caractères multi-octets? Comment tous les facteurs ci-dessus entrent en collision dans un environnement de haute performance (tel qu'un jeu vidéo moderne)? – Woot4Moo

+0

"Y a-t-il des raisons de rendre votre projet Unicode si vous ne prévoyez pas de prendre en charge d'autres langues?" Si vous envisagez d'utiliser des caractères avec des points de code entre 128 et 255, oui. Traiter les pages de code peut être assez ennuyeux. – JAB

+1

UTF-8 est un jeu de caractères multi-octets (encodage de caractères de longueur variable), n'est-ce pas? UTF-16 est également un encodage de caractères de longueur variable. – dalle

Répondre

22

Deux questions que je commenterais. En premier lieu, vous ne mentionnez pas la plate-forme que vous ciblez. Bien que les versions récentes de Windows (Win2000, WinXP, Vista et Win7) prennent en charge les versions multioctets et Unicode des appels système utilisant des chaînes, les versions Unicode sont plus rapides (les versions multi-octets sont des wrappers convertissant en Unicode, appellent la version Unicode). cordes de retour à mutlibyte). Donc, si vous faites beaucoup de ces types d'appels, l'Unicode sera plus rapide. Tout simplement parce que vous ne prévoyez pas explicitement de prendre en charge d'autres langues, vous devriez envisager de prendre en charge Unicode si votre application enregistre et affiche le texte entré par les utilisateurs. Tout simplement parce que votre application est unilingue, il ne s'ensuit pas que tous ses utilisateurs seront aussi unilingues. Ils peuvent être parfaitement heureux d'utiliser votre interface graphique en anglais, mais pourraient vouloir entrer des noms, des commentaires ou d'autres textes dans leur propre langue et les afficher correctement.

+2

"vous devriez toujours envisager de prendre en charge Unicode si votre application enregistre et affiche le texte entré par les utilisateurs" - et si votre application veut gérer des chemins avec des caractères arbitraires - et si elle traite de manière quelconque des chemins, elle le devrait. –

+1

C'est exactement ce que je voulais entendre .. que l'un est un emballage pour l'autre. Unicode tout le chemin bébé. –

+0

Salut à l'enfant Uniking. –

9

La réponse courte (OMI, et je l'ai déjà montré à tort) est qu'il vaut mieux planifier pour le pire (ou mieux selon votre point de vue) et faire unicode en ce moment.

À moins que votre application ne soit très gourmande en chaînes de caractères, le passage direct à unicode n'aura pas vraiment d'importance; dans le cas des jeux, cela ne devrait pas être un facteur important par rapport au reste du moteur.

Max.

+0

Et si, pour une raison magique, vous utilisez une chaîne de caractères dans une boucle serrée. Y aura-t-il une différence de performance importante? –

+0

@Stefan: Cela dépend de ce que vous faites avec cette chaîne. Si vous le copiez, et qu'il se compose principalement de caractères ASCII, la version MB sera un peu plus courte, et la copie sera peut-être plus rapide. Si vous effectuez un traitement de chaîne, la version Unicode sera probablement plus efficace, en raison de sa structure plus simple. Mais vraiment, c'est une telle hypothèse absurdement hypothétique, c'est inutile. Votre réponse est "peu importe les performances, et cela ne le sera jamais, et si c'est le cas, vous devriez tester les deux et voir ce qui fonctionne le mieux" – jalf

+0

En outre, si cela est important, vous pouvez optimiser cette boucle sans changer le type de projet. – Brian

9

Vous parlez du projet VC++ ici, n'est-ce pas? La seule chose que cela affecte est la version des appels de l'API Win32 qui finit par être exécutée. Par exemple, un appel à MessageBox se terminera par un appel à MessageBoxA en cas de paramètre multi-octet et MessageBoxW en cas de paramètre Unicode. Bien sûr, cela affectera également les types de paramètres de chaîne pour ces fonctions.En interne, MessageBoxA appelle MessageBoxW après avoir converti les paramètres de chaîne des paramètres régionaux actuels du système en Unicode.

Mon conseil est d'utiliser les paramètres Unicode et de passer des chaînes Unicode aux appels API Win32. Cela ne vous empêche pas d'utiliser des chaînes dans un autre encodage interne.

4

Y at-il des avantages pour aller Unicode droit dès le début,

Quelques années et un million de lignes de code plus tard, vous allez vous souhaiter aviez répondu « oui ».

impliquant toutes vos chaînes sera en format large?

Je souhaite que Microsoft quitterait la fusion de "Unicode" avec UTF-16.

Vous n'avez pas besoin de stocker toutes vos chaînes en format large. Vous pouvez utiliser UTF-8 à la place, et obtenir un encombrement de la mémoire plus faible (pour les langues de l'alphabet latin), et une rétrocompatibilité avec l'ASCII 7 bits. L'inconvénient d'utiliser UTF-8 sur Windows est qu'il n'est pas supporté comme une page de code ANSI, donc vous devez convertir vos chaînes en UTF-16 pour faire des appels WinAPI. Le nombre d'inconvénients que cela entraîne dépend de l'écriture d'un programme Windows ou d'un programme exécuté sur Windows.

8

Voici une considération simple: votre programme devrait-il fonctionner s'il est utilisé par M. 菅 直 人? Son répertoire personnel peut être difficile à représenter en ASCII.

+0

Excellent point –