lundi 26 janvier 2009

SDL, iconv, UCS-2 et UTF-8

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: