[Edition de fichier] j'ai des "^@" intercalés partout > Unicode ?

j'ai des "^@" intercalés partout > Unicode ? [Edition de fichier] - Shell/Batch - Programmation

Marsh Posté le 19-12-2002 à 00:45:05    

Hello tout le monde,
 
je cross post un peu un topic que j'ai lancé sur OSA. Voici le problème :
 
Je regarde des fichiers de log générés sur un serveur Unreal Tournament tournant sous Linux et entre chaque caractère j'ai un ^@ qui apparait, Voici un exemple où on voit marqué game GameMutator
 

^@g^@a^@m^@e^@  ^@G^@a^@m^@e^@M^@u^@t^@a^@t^@o^@r^@  

 
 
Kristoph m'a fait la remarque suivante :
 

UT => Unicode => log d'UT en Unicode
Le caractère ^@ correspond au caractère 0x00 en hexa. Unicode donc


 
En faisant un cat sur ce fichier, il s'affiche correctement. Mais en redirigeant le cat sur un fichier et en éditant celui après, j'ai toujours la même chose. J'ai bidouillé sans trop de raisons avec flip et dos2unix, mais ca ne change pas. J'ai fini par tenté un less apres un export LESSCHARSET=utf-8, mais ca ne fonctionne pas.
 
Il me faudra juste un cat "unicode", que je puisse redirigé sa sortie dans un fichier. Une idée d'outil déja existant ou autre ?
 
Merci d'avance à vous !
 
A+


Message édité par Evadream -jbd- le 19-12-2002 à 01:40:33
Reply

Marsh Posté le 19-12-2002 à 00:45:05   

Reply

Marsh Posté le 19-12-2002 à 01:39:58    

J'ai mis au point une petite fonction en C qui vaut ce qu'elle vaut, et qui me permet d'obtenir un fichier sans les ^@ entre chaque caractère, juste en me décalant d'un octet avant chaque lecture...
 

Code :
  1. void un2txt(FILE* source,FILE* destination){   
  2. char i;
  3.     while(!feof(source)){
  4.         if(isascii(i=fgetc(source)) && i != 0){
  5.                 fputc(i,destination);
  6.                 fgetc(source);
  7.         }
  8.     }
  9. }


 
Rien d'exceptionnel donc... J'aimerais tout de même en savoir un peu plus sur le fond du problème... =)
 
Par ailleurs, je profite de cette question pour vous demander comment exploiter les jokers en ligne de commande ? J'imagine bien sur qu'il va falloir passer par argc, argv* char[], mais c'est pour savoir si il y a des mécanismes tout fait ou il faut que je fasse ca avec mes petites mains ?
 
Par exemple, si je veux convertir un ensemble de fichier d'un répertoire avec mon petit programme, que je nommerais conv, et que je veuille appliquer ce prog à l'ensemble de fichiers d'un répertoire en faisant ./conv * ?
 
Merci d'avance !
 
A+


Message édité par Evadream -jbd- le 19-12-2002 à 01:51:32
Reply

Marsh Posté le 19-12-2002 à 19:45:02    

Evadream -jbd- a écrit :

Hello tout le monde,
 
je cross post un peu un topic que j'ai lancé sur OSA. Voici le problème :
 
Je regarde des fichiers de log générés sur un serveur Unreal Tournament tournant sous Linux et entre chaque caractère j'ai un ^@ qui apparait, Voici un exemple où on voit marqué game GameMutator
 

^@g^@a^@m^@e^@  ^@G^@a^@m^@e^@M^@u^@t^@a^@t^@o^@r^@  

 
 
Kristoph m'a fait la remarque suivante :
 

UT => Unicode => log d'UT en Unicode
Le caractère ^@ correspond au caractère 0x00 en hexa. Unicode donc


 
En faisant un cat sur ce fichier, il s'affiche correctement. Mais en redirigeant le cat sur un fichier et en éditant celui après, j'ai toujours la même chose. J'ai bidouillé sans trop de raisons avec flip et dos2unix, mais ca ne change pas. J'ai fini par tenté un less apres un export LESSCHARSET=utf-8, mais ca ne fonctionne pas.
 
Il me faudra juste un cat "unicode", que je puisse redirigé sa sortie dans un fichier. Une idée d'outil déja existant ou autre ?
 
Merci d'avance à vous !
 
A+


 
si ca vient d'un ftp ton fichier c'est normal que ca ai merde, tu etait pas dans le bon mode....
ascii/bin
 
tu peux utiliser dos2unix comme script par exemple
 


---------------
[:kuroineko] Francois.P tel: (+33)617230820 http://www.ifrance.com/fpussault  fpussault@caramail.com
Reply

Marsh Posté le 19-12-2002 à 19:52:24    

Evadream -jbd- a écrit :

Rien d'exceptionnel donc... J'aimerais tout de même en savoir un peu plus sur le fond du problème... =)


 
Bin en fait, Unicode c'est une énoooorme table ASCII dans laquelle sont stockés les caractères de tous les langages. Evidemment, en codant les caractères sur 2 octets comme en Anglais ou Français, c'est pas suffisant pour tout mettre. Donc pour pouvoir faire ça, chaque caractère Unicode est encodé sur 4 octets. Du coup, un caractère comme espace au lieu d'être encodé sous la forme 0x20 bin il devient 0x0020. D'où l'apparition des caractères zarbes que t'as eus :)

Reply

Marsh Posté le 20-12-2002 à 00:47:22    

kuroineko > Merci pour ta réponse, mais le problème ne venait pas de là, j'avais d'ailleurs déja fait des essais avec dos2unix et flip =)
 
Taiche > Merci énormément pour tes précisions !
 
A+

Reply

Marsh Posté le 20-12-2002 à 08:56:16    

Taiche a écrit :


 
Bin en fait, Unicode c'est une énoooorme table ASCII dans laquelle sont stockés les caractères de tous les langages. Evidemment, en codant les caractères sur 2 octets comme en Anglais ou Français, c'est pas suffisant pour tout mettre. Donc pour pouvoir faire ça, chaque caractère Unicode est encodé sur 4 octets. Du coup, un caractère comme espace au lieu d'être encodé sous la forme 0x20 bin il devient 0x0020. D'où l'apparition des caractères zarbes que t'as eus :)


 :heink:  
T'as fumé la moquette toi ! D'ou t'as vu qu'unicode est codé sur 4 octets ?
Unicode est codé sur 16 bits, donc 2 octets ! Tu trouves que 65535 caractères possibles, c pas suffisant ?
Et 0x0020 est un nombre 16 bits, et non 32 bits !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-12-2002 à 09:54:29    

Harkonnen a écrit :


 :heink:  
T'as fumé la moquette toi ! D'ou t'as vu qu'unicode est codé sur 4 octets ?
Unicode est codé sur 16 bits, donc 2 octets ! Tu trouves que 65535 caractères possibles, c pas suffisant ?
Et 0x0020 est un nombre 16 bits, et non 32 bits !


 
Humpf, je me suis carrément mélangé les pinceaux :o
Oui, c'est bien évidemment 2 octets et non 4 comme j'ai pu l'écrire dans un élan de connerie (fatigue ???) hier soir. Sinon y aurait 3 caractères zarbes devant chaque lettre et non un seul :D
Bref, désolé...


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 20-12-2002 à 10:12:40    

Alors j'viens de me renseigner et comme j'me disais bien que 65535 caractères, c'était pas assez pour tout coder (si on prend tous les langages existants, vivants ou morts), bin en fait il existe un truc encore plus bourrin qui est l'UCS-4 (ISO 10646). C'est codé sur 31 bits (le 32ème n'est pas utilisé) et est assez rarement pris en compte dans la pratique. Bref, ça existe mais c'est tout :D A noter que la forme UCS-2 est équivalente à l'Unicode.
Tout ça pour dire que l'encodage sur (presque) 4 octets, ça existe si jamais y a des gens qui le cherchent :)


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed