vendredi 21 novembre 2008

Ruby pack & unpack - Problème de jeux de caractères

Il arrive souvent que dans les applications nous rencontrons un problème avec les différents jeux de caractères (ASCII, LATIN-1, UTF-8) ; il faut alors les convertir. [astuce]
Remarque : afin de gérer tous les caractères de toutes les langues, préférez l'encodage UTF-8.

$KCODE = 'U' #UTF-8 : s'assurer que le code de la page est en UTF-8

En Ruby vous pouvez trouver ceci pour résoudre votre problème : [iconv]

# attention destination, source Latin-1 => UTF-8
@c = Iconv.new('utf-8','iso-8859-1')
text = @c.iconv(mon_texte_a_encoder)


Iconv.new('iso-8859-15//IGNORE//TRANSLIT', 'utf-8').iconv(text)
Cette fonction comporte cependant quelques "Bugs" et vous devez gérer les cas particuliers des accents.
Il est donc préférable d'utiliser
pack, unpack :

*/
unpack : créé un tableau avec le n° du caractère ascii (code ASCII)
C : 0 à 255
c : -128 à 127

*/
pack : ffff
U : UTF-8

Transformer un "string" iso-8859-1 en UTF-8 :
string.unpack('C*').pack('U*')
Ruby Doc [arr.pack] - [str.unpack(format) => anArray]