Salut,
Avant toute chose, mon objectif : supporter tous les langues dans le
jeu Wormux (www.wormux.org, clone libre de Worms). Je voudrais
utiliser un conteneur STL si possible.
Je voudrais savoir s'il existe une solution simple et portable pour
utiliser les codes Unicode comme charset dans un programme.
Salut,
Avant toute chose, mon objectif : supporter tous les langues dans le
jeu Wormux (www.wormux.org, clone libre de Worms). Je voudrais
utiliser un conteneur STL si possible.
Je voudrais savoir s'il existe une solution simple et portable pour
utiliser les codes Unicode comme charset dans un programme.
Salut,
Avant toute chose, mon objectif : supporter tous les langues dans le
jeu Wormux (www.wormux.org, clone libre de Worms). Je voudrais
utiliser un conteneur STL si possible.
Je voudrais savoir s'il existe une solution simple et portable pour
utiliser les codes Unicode comme charset dans un programme.
Avant toute chose, mon objectif : supporter tous les langues dans le
jeu Wormux (www.wormux.org, clone libre de Worms). Je voudrais
utiliser un conteneur STL si possible.
Je voudrais savoir s'il existe une solution simple et portable pour
utiliser les codes Unicode comme charset dans un programme.
J'ai pas
mal lu sur ce sujet, mais je n'ai pas trouvé *la* solution.
A ce que
j'ai compris, il existe principalement les encodages suivants :
- UTF-8 : Caractère codé sur une longueur variant de 1 à 6 octets.
Complexifie énormément l'accès aléatoire, la suppression à l'intérieur
d'une chaîne, etc. Solution courament choisie sous Linux
- UCS-4 (ou "UCS-32" ?) : Chaque caractère est codé sur 4 octets.
C'est la solution optimale (niveau CPU, pas mémoire) pour l'Unicode
4.0 (ou 4.1) car on peut rentrer tous les caractères dans 32 bits et
90% des processeurs actuels travaillent en 32 bits.
- UCS-2 (ou "UCS-16" ?) : Solution adoptée pour les Windows 95/98/Me.
On n'a accès qu'aux premiers 65536 caractères
- UTF-16 : Amélioration de l'UCS-2 sur Windows 2000/XP.
Maintenant, à ce que j'ai compris, le type "wchat_t" a une taille de 2
octets sous Windows ... pour raison historique (Windows 95 et son
UCS-2), alors que sous Unix on a directement 4 octets. De là, la
classe std::wstring travaille en UCS-2 ou UCS-4.
Je suis toujours bon jusque là ?
Maintenant, que faut-il faire pour avoir un std::wstring en UCS-4 à
tous les coups ? "typedef std::basic_string<uint32> mon_string_ucs4;"
?
Après ça se complique encore avec les caractères composés, comme é (e
accent aigu) = e + accent aigu (deux glyphes Unicode) ...
Avant toute chose, mon objectif : supporter tous les langues dans le
jeu Wormux (www.wormux.org, clone libre de Worms). Je voudrais
utiliser un conteneur STL si possible.
Je voudrais savoir s'il existe une solution simple et portable pour
utiliser les codes Unicode comme charset dans un programme.
J'ai pas
mal lu sur ce sujet, mais je n'ai pas trouvé *la* solution.
A ce que
j'ai compris, il existe principalement les encodages suivants :
- UTF-8 : Caractère codé sur une longueur variant de 1 à 6 octets.
Complexifie énormément l'accès aléatoire, la suppression à l'intérieur
d'une chaîne, etc. Solution courament choisie sous Linux
- UCS-4 (ou "UCS-32" ?) : Chaque caractère est codé sur 4 octets.
C'est la solution optimale (niveau CPU, pas mémoire) pour l'Unicode
4.0 (ou 4.1) car on peut rentrer tous les caractères dans 32 bits et
90% des processeurs actuels travaillent en 32 bits.
- UCS-2 (ou "UCS-16" ?) : Solution adoptée pour les Windows 95/98/Me.
On n'a accès qu'aux premiers 65536 caractères
- UTF-16 : Amélioration de l'UCS-2 sur Windows 2000/XP.
Maintenant, à ce que j'ai compris, le type "wchat_t" a une taille de 2
octets sous Windows ... pour raison historique (Windows 95 et son
UCS-2), alors que sous Unix on a directement 4 octets. De là, la
classe std::wstring travaille en UCS-2 ou UCS-4.
Je suis toujours bon jusque là ?
Maintenant, que faut-il faire pour avoir un std::wstring en UCS-4 à
tous les coups ? "typedef std::basic_string<uint32> mon_string_ucs4;"
?
Après ça se complique encore avec les caractères composés, comme é (e
accent aigu) = e + accent aigu (deux glyphes Unicode) ...
Avant toute chose, mon objectif : supporter tous les langues dans le
jeu Wormux (www.wormux.org, clone libre de Worms). Je voudrais
utiliser un conteneur STL si possible.
Je voudrais savoir s'il existe une solution simple et portable pour
utiliser les codes Unicode comme charset dans un programme.
J'ai pas
mal lu sur ce sujet, mais je n'ai pas trouvé *la* solution.
A ce que
j'ai compris, il existe principalement les encodages suivants :
- UTF-8 : Caractère codé sur une longueur variant de 1 à 6 octets.
Complexifie énormément l'accès aléatoire, la suppression à l'intérieur
d'une chaîne, etc. Solution courament choisie sous Linux
- UCS-4 (ou "UCS-32" ?) : Chaque caractère est codé sur 4 octets.
C'est la solution optimale (niveau CPU, pas mémoire) pour l'Unicode
4.0 (ou 4.1) car on peut rentrer tous les caractères dans 32 bits et
90% des processeurs actuels travaillent en 32 bits.
- UCS-2 (ou "UCS-16" ?) : Solution adoptée pour les Windows 95/98/Me.
On n'a accès qu'aux premiers 65536 caractères
- UTF-16 : Amélioration de l'UCS-2 sur Windows 2000/XP.
Maintenant, à ce que j'ai compris, le type "wchat_t" a une taille de 2
octets sous Windows ... pour raison historique (Windows 95 et son
UCS-2), alors que sous Unix on a directement 4 octets. De là, la
classe std::wstring travaille en UCS-2 ou UCS-4.
Je suis toujours bon jusque là ?
Maintenant, que faut-il faire pour avoir un std::wstring en UCS-4 à
tous les coups ? "typedef std::basic_string<uint32> mon_string_ucs4;"
?
Après ça se complique encore avec les caractères composés, comme é (e
accent aigu) = e + accent aigu (deux glyphes Unicode) ...
Ca depend un peu des caracteres dont tu as besoin,
et ce que tu entends par " portable "
Dans l'absolu, " portable " et " affichage " sont
des contradictions -- pour commencer, tu ne peux pas afficher des
caracteres qui ne sont pas presentent dans la police utilisee,
a moins d'afficher tout en mode graphique (et alors, il n'y a rien
de portable).
La meilleur solution du point de vue technique, c'est certainement
UTF-8 en extern, et UCS-4 (ou UTF-32, ce qui revient au meme) en
intern. Certaines applications Linux (et Solaris ou HP/UX) l'ont
adopte, mais c'est loin d'etre universel. Sauf sous Plan 9.
C'est un peu plus complexe que ca. Historiquement, (...)
Maintenant, que faut-il faire pour avoir un std::wstring en UCS-4 à
tous les coups ? "typedef std::basic_string<uint32> mon_string_ucs4;"
?
Ce n'est pas si simple. Parce que std::basic_string exige plusieurs
parametres ; le deuxieme, par defaut, serait std::char_traits<uint32>.
Qui n'est pas defini par la norme (...)
Pour la reste, il va falloir aussi que tu definisses un certain nombre
de facettes, selon ce que tu veux faire (mais au moins des facettes
de codecvt). Ce qui est loin d'etre evident.
Et enfin, n'oublis surtout pas que l'affichage est independant
du C++. Il faut s'assurer que la police utilisee a l'affichage
utilise le meme encodage que ton programme, et autant que je sache,
il n'y a aucune solution portable pour ca.
Ca depend un peu des caracteres dont tu as besoin,
et ce que tu entends par " portable "
Dans l'absolu, " portable " et " affichage " sont
des contradictions -- pour commencer, tu ne peux pas afficher des
caracteres qui ne sont pas presentent dans la police utilisee,
a moins d'afficher tout en mode graphique (et alors, il n'y a rien
de portable).
La meilleur solution du point de vue technique, c'est certainement
UTF-8 en extern, et UCS-4 (ou UTF-32, ce qui revient au meme) en
intern. Certaines applications Linux (et Solaris ou HP/UX) l'ont
adopte, mais c'est loin d'etre universel. Sauf sous Plan 9.
C'est un peu plus complexe que ca. Historiquement, (...)
Maintenant, que faut-il faire pour avoir un std::wstring en UCS-4 à
tous les coups ? "typedef std::basic_string<uint32> mon_string_ucs4;"
?
Ce n'est pas si simple. Parce que std::basic_string exige plusieurs
parametres ; le deuxieme, par defaut, serait std::char_traits<uint32>.
Qui n'est pas defini par la norme (...)
Pour la reste, il va falloir aussi que tu definisses un certain nombre
de facettes, selon ce que tu veux faire (mais au moins des facettes
de codecvt). Ce qui est loin d'etre evident.
Et enfin, n'oublis surtout pas que l'affichage est independant
du C++. Il faut s'assurer que la police utilisee a l'affichage
utilise le meme encodage que ton programme, et autant que je sache,
il n'y a aucune solution portable pour ca.
Ca depend un peu des caracteres dont tu as besoin,
et ce que tu entends par " portable "
Dans l'absolu, " portable " et " affichage " sont
des contradictions -- pour commencer, tu ne peux pas afficher des
caracteres qui ne sont pas presentent dans la police utilisee,
a moins d'afficher tout en mode graphique (et alors, il n'y a rien
de portable).
La meilleur solution du point de vue technique, c'est certainement
UTF-8 en extern, et UCS-4 (ou UTF-32, ce qui revient au meme) en
intern. Certaines applications Linux (et Solaris ou HP/UX) l'ont
adopte, mais c'est loin d'etre universel. Sauf sous Plan 9.
C'est un peu plus complexe que ca. Historiquement, (...)
Maintenant, que faut-il faire pour avoir un std::wstring en UCS-4 à
tous les coups ? "typedef std::basic_string<uint32> mon_string_ucs4;"
?
Ce n'est pas si simple. Parce que std::basic_string exige plusieurs
parametres ; le deuxieme, par defaut, serait std::char_traits<uint32>.
Qui n'est pas defini par la norme (...)
Pour la reste, il va falloir aussi que tu definisses un certain nombre
de facettes, selon ce que tu veux faire (mais au moins des facettes
de codecvt). Ce qui est loin d'etre evident.
Et enfin, n'oublis surtout pas que l'affichage est independant
du C++. Il faut s'assurer que la police utilisee a l'affichage
utilise le meme encodage que ton programme, et autant que je sache,
il n'y a aucune solution portable pour ca.
- Sinon, il y a la bibliothèque ICU
(http://oss.software.ibm.com/icu/index.html) pour C. C'est du
UTF-16, et non du UCS-4, mais au moins d'avoir réelement besoin des
caractères non présents en UCS-2, ça revient au même. Et c'est très
complet. En écrire un wrapper C++ ne doit pas poser de gros
problèmes.
- Sinon, il y a la bibliothèque ICU
(http://oss.software.ibm.com/icu/index.html) pour C. C'est du
UTF-16, et non du UCS-4, mais au moins d'avoir réelement besoin des
caractères non présents en UCS-2, ça revient au même. Et c'est très
complet. En écrire un wrapper C++ ne doit pas poser de gros
problèmes.
- Sinon, il y a la bibliothèque ICU
(http://oss.software.ibm.com/icu/index.html) pour C. C'est du
UTF-16, et non du UCS-4, mais au moins d'avoir réelement besoin des
caractères non présents en UCS-2, ça revient au même. Et c'est très
complet. En écrire un wrapper C++ ne doit pas poser de gros
problèmes.
(Victor STINNER) writes:
- Sinon, il y a la bibliothèque ICU
(http://oss.software.ibm.com/icu/index.html) pour C. C'est du
UTF-16, et non du UCS-4, mais au moins d'avoir réelement besoin des
caractères non présents en UCS-2, ça revient au même. Et c'est très
complet. En écrire un wrapper C++ ne doit pas poser de gros
problèmes.
|> Notre jeu, Wormux(.org) pour rappel, utilise la librairie ClanLib.
|> Or cette dernière ne semble pas encore supporter autre chose que
|> "char*", donc c'est pas gagné ...
Tu peux mettre de l'UTF-8 dans des char[]. Traite la bibliothèque comme
un élément « externe ».
spam@haypocalc.com (Victor STINNER) writes:
- Sinon, il y a la bibliothèque ICU
(http://oss.software.ibm.com/icu/index.html) pour C. C'est du
UTF-16, et non du UCS-4, mais au moins d'avoir réelement besoin des
caractères non présents en UCS-2, ça revient au même. Et c'est très
complet. En écrire un wrapper C++ ne doit pas poser de gros
problèmes.
|> Notre jeu, Wormux(.org) pour rappel, utilise la librairie ClanLib.
|> Or cette dernière ne semble pas encore supporter autre chose que
|> "char*", donc c'est pas gagné ...
Tu peux mettre de l'UTF-8 dans des char[]. Traite la bibliothèque comme
un élément « externe ».
(Victor STINNER) writes:
- Sinon, il y a la bibliothèque ICU
(http://oss.software.ibm.com/icu/index.html) pour C. C'est du
UTF-16, et non du UCS-4, mais au moins d'avoir réelement besoin des
caractères non présents en UCS-2, ça revient au même. Et c'est très
complet. En écrire un wrapper C++ ne doit pas poser de gros
problèmes.
|> Notre jeu, Wormux(.org) pour rappel, utilise la librairie ClanLib.
|> Or cette dernière ne semble pas encore supporter autre chose que
|> "char*", donc c'est pas gagné ...
Tu peux mettre de l'UTF-8 dans des char[]. Traite la bibliothèque comme
un élément « externe ».
- Toutes les plateformes en question ont des locales où on supporte
soit UCS-2 (sizeof(wchar_t) == 2) soit UCS-4 (sizeof(wchar_t) == 4).
S'il ne s'agit que de l'affichage, std::wstring, des constantes de
chaîne du type L"...", et la police qu'il faut fait l'affaire. Ce
n'est pas la peine de chercher plus loin.
- Toutes les plateformes en question ont des locales où on supporte
soit UCS-2 (sizeof(wchar_t) == 2) soit UCS-4 (sizeof(wchar_t) == 4).
S'il ne s'agit que de l'affichage, std::wstring, des constantes de
chaîne du type L"...", et la police qu'il faut fait l'affaire. Ce
n'est pas la peine de chercher plus loin.
- Toutes les plateformes en question ont des locales où on supporte
soit UCS-2 (sizeof(wchar_t) == 2) soit UCS-4 (sizeof(wchar_t) == 4).
S'il ne s'agit que de l'affichage, std::wstring, des constantes de
chaîne du type L"...", et la police qu'il faut fait l'affaire. Ce
n'est pas la peine de chercher plus loin.
James Kanze wrote in message
news:...- Toutes les plateformes en question ont des locales où on supporte
soit UCS-2 (sizeof(wchar_t) == 2) soit UCS-4 (sizeof(wchar_t) == 4).
S'il ne s'agit que de l'affichage, std::wstring, des constantes de
chaîne du type L"...", et la police qu'il faut fait l'affaire. Ce
n'est pas la peine de chercher plus loin.
Au fait, j'utilise largement gettext dans mon programme, c'est grâve
docteur ???
Ca prend du char* en entrée, et ça donne du char* en sortie. Dois-je
comprendre "UTF-8" en sortie si on lui demande poliment ? (en touchant
aux locales)
Du code du style :
std::cout << Format(_("Player %s died."), player.nane.c_str()) <<
std::endl;
Le prototype de la fonction Format étant :
std::string Format (char*, ...);
C'est ma version C++ de printf.
Je n'utilise pas de std::ostringstream pour pouvoir internationnaliser
le jeu.
James Kanze <kanze@gabi-soft.fr> wrote in message
news:<m21xiov3p5.fsf@lns-vlq-34-82-253-19-7.adsl.proxad.net>...
- Toutes les plateformes en question ont des locales où on supporte
soit UCS-2 (sizeof(wchar_t) == 2) soit UCS-4 (sizeof(wchar_t) == 4).
S'il ne s'agit que de l'affichage, std::wstring, des constantes de
chaîne du type L"...", et la police qu'il faut fait l'affaire. Ce
n'est pas la peine de chercher plus loin.
Au fait, j'utilise largement gettext dans mon programme, c'est grâve
docteur ???
Ca prend du char* en entrée, et ça donne du char* en sortie. Dois-je
comprendre "UTF-8" en sortie si on lui demande poliment ? (en touchant
aux locales)
Du code du style :
std::cout << Format(_("Player %s died."), player.nane.c_str()) <<
std::endl;
Le prototype de la fonction Format étant :
std::string Format (char*, ...);
C'est ma version C++ de printf.
Je n'utilise pas de std::ostringstream pour pouvoir internationnaliser
le jeu.
James Kanze wrote in message
news:...- Toutes les plateformes en question ont des locales où on supporte
soit UCS-2 (sizeof(wchar_t) == 2) soit UCS-4 (sizeof(wchar_t) == 4).
S'il ne s'agit que de l'affichage, std::wstring, des constantes de
chaîne du type L"...", et la police qu'il faut fait l'affaire. Ce
n'est pas la peine de chercher plus loin.
Au fait, j'utilise largement gettext dans mon programme, c'est grâve
docteur ???
Ca prend du char* en entrée, et ça donne du char* en sortie. Dois-je
comprendre "UTF-8" en sortie si on lui demande poliment ? (en touchant
aux locales)
Du code du style :
std::cout << Format(_("Player %s died."), player.nane.c_str()) <<
std::endl;
Le prototype de la fonction Format étant :
std::string Format (char*, ...);
C'est ma version C++ de printf.
Je n'utilise pas de std::ostringstream pour pouvoir internationnaliser
le jeu.