|
|
|
|
[java] code ascii d'un char mais en unicode 8
Dernière réponse le 10 sep 2008 à 09:36:37 sbouli, le 4 sep 2008 à 10:11:04Bonjour,
Je cherche pour décompresser une chaine codée en lzw, à obtenir le code ascii d'un caractère, pour le moment si je fait :
public static int toASCII(char lettre)
{
return (int)lettre;
}
il me retourne la valeur unicode sur 16 bits et pas 8 bits par exemple Ä renvoi 65533 et pas 257 ...
évidement la chaine étant encodé par différent language (les clients varies) il faut que je puisse travailler en UTF 8
J'ai essayé de convertir ma string dès le départ avec :
byte[] utf8Bytes = txt2decode.getBytes("UTF8");
txt2decode = new String(utf8Bytes, "UTF8");
mais ça n'a rien changé ... pour infos ma boucle à cette tête :
String[] splitStr = txt2decode.split("") ;
for (i = 0 ; i < length ; i++) {
String current = splitStr [i] ;
int code = toASCII(txt2decode.charAt(i));
.....
}
Merci d'avance.
Stéphane
Configuration: Windows XP Safari 525.13
Il me semble que java travaille en interne avec des caractères UTF-16. Donc, le code d'un caractère d'une chaîne java est renvoyé en UTF-16.
|
Tu as un tableau de bytes. Les bytes java sont codés de -128 à 128, je crois.
|
Tu as un tableau de bytes. Les bytes java sont codés de -128 à 128, je crois.
|
Une petite fonction utile qui imprime les octets d'une chaîne en fonction de l'encodage choisi..
|
Hello,
//conversion en AS3 de l'algorythm de Zeh Fernando version 1.0.0
public class LZW {
static var headerversion:String = "v1.0";
// ===============================================================
// COMPRESSION function -------------------------------------
public static function compress (txt2encode:String): String {
var dico:Array = new Array() ;
for ( var i:int =0 ; i<256 ; i++) dico[ String.fromCharCode (i) ] = i ;
var result:String = "";
var splitStr:Array = txt2encode.split("") ;
var length:int = splitStr.length ;
var nbChar:int = 257 ; // Nombres de caractères courant dans le dictionnaire
var buffer:String = "" ; // initialisation du tampon buffer
for (i=0 ; i <= length ; i++) {
var current = splitStr[i] ;
if ( dico[ buffer + current ] !== undefined ) {
buffer += current ;
} else {
result += String.fromCharCode ( dico[buffer] ) ;
dico [buffer + current] = nbChar++;
buffer = current ;
}
}
return (headerversion+result);
}
// ===============================================================
// FAST DECOMPRESSION function -----------------------------------
public static function decompress (txt2decode:String): String {
txt2decode = txt2decode.substring(headerversion.length);// on supprime le header "v1.0"
var dico:Array = new Array() ;
for ( var i:int =0 ; i<256 ; i++) {
var c:String = String.fromCharCode (i) ;
dico[c] = c ;
}
var splitStr:Array = txt2decode.split("") ;
var length:int = splitStr.length ;
var nbChar:int = 257; // nombre de caractère courant dans le dictionnaire
var buffer:String = "" ; // initialisation du tampon mémoire
var chaine:String = "" ; // chaine temporaire
var result:String = "" ; // chaine retournée à la fin de la décompression
for (i = 0 ; i < length ; i++) {
var current:String = splitStr [i] ;
var code:int = txt2decode.charCodeAt(i) ;
//trace("code "+code+" "+splitStr[i]);
if (buffer == "") {
buffer = current ;
result += current ;
} else {
if ( code <= 256 ) {
result += current ;
chaine = buffer + current ;
dico[nbChar] = chaine ;
nbChar ++ ;
buffer = current ;
} else {
chaine = dico [code] ;
result += chaine ;
dico [nbChar] = buffer + chaine.slice (0, 1);
nbChar ++ ;
buffer = chaine ;
}
}
}
return result;
}
// ===============================================================
}//public class LZW
Pour infos, l'exemple de chaine que je compresse est : "<call> <cmd>login</cmd> <callback>login</callback> <id_membre>255</id_membre> <id_site>0</id_site> <pseudo>toto</pseudo> </call>" qui devient quelque chose comme (je suis pas sûr que le debugger + le copier/coller préserve les caractères ...) : <call>āmd>login</cċĆĈāălbackčďđēĂĄĜĞėĉid_membre>255ēĪĬĮİIJćĩīsitIJ0ķĿŁļĘpseudo>toőēŊŌŎĆģĚ>""" Merci pour ton aide !! |

