J'avais pourtant bien cherché partout! Mais impossible de trouver confirmation que l'encodage unicode dans SDL (plus exactement dans le champ keysym.unicode) est bien de l'UCS-2. Cependant, vu que UCS-2 est le seul encodage en taille fixe à 2 octets, il semblait difficile qu'il en soit autrement.
La mauvaise nouvelle, c'est que UCS-2 ne peut pas encoder toute la plage de caractères unicode. La bonne, c'est que SDL semble être passé à l'UCS-4 (également connu sous le nom d'UTF-32) dans la version 1.3, qui sortira bientôt. D'ici là, il va falloir faire avec!
Mon problème, c'est que mon application est complètement UTF-8. Il va donc falloir convertir mon UCS-2 en UTF-8, et c'est là que les choses se gâtent. La bibliothèque iconv, appartenant à la libc la bien nommée, va donc venir à notre aide pour nous sortir de ce mauvais pas. Exemple:
extern "C"
{
#include "iconv.h"
}
std::string UcsToUtf8(Uint16 c)
{
char output[4];
char * p_input = reinterpret_cast(&c);
size_t input_size = sizeof(c);
char * p_output = output;
size_t output_size = 4;
iconv_t conv = iconv_open("UTF-8", "UCS-2");
iconv(conv, &p_input, &input_size, &p_output, &output_size);
iconv_close(conv);
std::string strout;
if(output_size < 4)
{
strout = std::string(output, 4 - output_size);
}
return strout;
}
La bibliothèque iconv étant en C pur, il va falloir jouer avec les extern "C" et les reinterpret_cast un peu partout, mais voilà en gros comment écrire une fonction qui prend un champ unicode SDL, et l'encode en UTF-8 dans une std::string standard.
Aucun commentaire:
Enregistrer un commentaire