IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Problème avec caractères chinois


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Problème avec caractères chinois
    J'extrais d'un fichier plusieurs zone de texte via des head et tail (seule façon que j'ai trouvé pour garder les caractères spéciaux et savoir où je me trouve dans le fichier)

    Voici un exemple du fichier en hexa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    52 00 6f 00 62 00 65 00 20 00 64 00 65 00 20 00 66 00 e9 00 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 be ab c1 e9 c8 b9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4d 6f 64 65 6c 73 5c 4d 61 74 74 65 72 73 5c ce ef c6 b7 5c ca b1 d7 b0 b5 f4 c2 e4 5c ca b1 d7 b0 b5 f4 c2 e4 2e 65 63 6d 00 00 00 00 00 00 00
    Voici le code utilisé (rien de sorcier...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    head -c64 elements.txt > fichier
    tail -c+96 elements.txt > tmp
    echo -n "	" >> fichier
    head -c48 tmp >> fichier
    sed -i 's/\x00//g' fichier
    1ère partie en français le plus souvent (chaque lettre est séparée par le caractère hexa 00). Cela donne donc "Robe de fée" une fois le 00 enlevés.
    Cela peux aussi être dans de rares cas en chinois (sans la séparation par les 00).

    Dernière partie en chinois simplifié :
    Models\Matters\物品\时装掉落\时装掉落.ecm

    Ce que j'obtiens via mon script (je vois que c'est le codage ANSI qui a été choisi ...) :
    Robe de fée Models\Matters\ÎïÆ·\ʱװµôÂä\ʱװµôÂä.ecm

    Si je force la lecture dans mon éditeur de texte en chinois simplifié:
    Robe de f閑 Models\Matters\物品\时装掉落\时装掉落.ecm

    Il y a-t-il un moyen de forcer le codage pour avoir le résultat voulu (texte en français visible ainsi que le texte en chinois) ?
    Voici ce que j'aimerais avoir:
    Robe de fée Models\Matters\物品\时装掉落\时装掉落.ecm

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ od -t x1 elements.txt
    0000000 52 00 6f 00 62 00 65 00 20 00 64 00 65 00 20 00
    0000020 66 00 e9 00 65 00 00 00 00 00 00 00 00 00 00 00
    0000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    *
    0000100 be ab c1 e9 c8 b9 00 00 00 00 00 00 00 00 00 00
    0000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    0000140 4d 6f 64 65 6c 73 5c 4d 61 74 74 65 72 73 5c ce
    0000160 ef c6 b7 5c ca b1 d7 b0 b5 f4 c2 e4 5c ca b1 d7
    0000200 b0 b5 f4 c2 e4 2e 65 63 6d 00 00 00 00 00 00 00
    0000220
    $ printf "%s\n" "$(dd if=elements.txt bs=1 count=64 2>/dev/null | iconv -f UTF-16)"
    Robe de fée
    $ printf "%s\n" "$(dd if=elements.txt bs=1 skip=64 count=32 2>/dev/null | iconv -f GB18030)"
    精灵裙
    $ printf "%s\n" "$(dd if=elements.txt bs=1 skip=96 2>/dev/null | iconv -f GB18030)"
    Models\Matters\物品\时装掉落\时装掉落.ecm
    Si les dernières lignes n'apparaissent pas correctement dans les balises code, comme c'est le cas avec mon navigateur, les voici en texte brut:

    $ printf "%s\n" "$(dd if=elements.txt bs=1 skip=64 count=32 2>/dev/null | iconv -f GB18030)"
    精灵裙
    $ printf "%s\n" "$(dd if=elements.txt bs=1 skip=96 2>/dev/null | iconv -f GB18030)"
    Models\Matters\物品\时装掉落\时装掉落.ecm

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci énormément pour ton aide.

    Si j'ai bien compris, printf affiche le résultat de la commande entre parenthèse.
    La première partie sélectionne un extrait du fichier.
    La deuxième le converti au format voulu.
    C'est bien ça?

    Voici ce que j'utilise en me basant sur ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf "%s\n" "$(dd if=elements.txt bs=1 count=64 2>/dev/null | iconv -f CP1252 -t UTF-8)" > fichier
    printf "%s\n" "$(dd if=elements.txt bs=1 skip=64 count=32 2>/dev/null | iconv -f GB18030 -t UTF-8)" >> fichier
    printf "%s\n" "$(dd if=elements.txt bs=1 skip=96 2>/dev/null | iconv -f GB18030 -t UTF-8)" >> fichier
    J'ai mis "-f CP1252 -t UTF-8" pour le 1er en fr car avec ta version ça affichait du chinois chez moi
    Le " -t UTF-8" dans les lignes suivantes est juste là pour faire joli, ça marche très bien sans

    J'ai testé avec le head et le tail, ça fonctionne moins bien que le dd
    Je ne connaissait pas la commande dd.
    Je sens qu'elle va me faire gagner du temps dans mon traitement

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par Beginner.j Voir le message
    Si j'ai bien compris, printf affiche le résultat de la commande entre parenthèse.
    La première partie sélectionne un extrait du fichier.
    La deuxième le converti au format voulu.
    C'est bien ça?
    exactement.
    Voici ce que j'utilise en me basant sur ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf "%s\n" "$(dd if=elements.txt bs=1 count=64 2>/dev/null | iconv -f CP1252 -t UTF-8)" > fichier
    printf "%s\n" "$(dd if=elements.txt bs=1 skip=64 count=32 2>/dev/null | iconv -f GB18030 -t UTF-8)" >> fichier
    printf "%s\n" "$(dd if=elements.txt bs=1 skip=96 2>/dev/null | iconv -f GB18030 -t UTF-8)" >> fichier
    J'ai mis "-f CP1252 -t UTF-8" pour le 1er en fr car avec ta version ça affichait du chinois chez moi
    Le " -t UTF-8" dans les lignes suivantes est juste là pour faire joli, ça marche très bien sans
    Tu as peut-être un problème de configuration, je n'ai pas mis le "-t UTF-8" car c'est le codage par défaut de ma locale courante, mais alors pourquoi le chinois traditionnel s'affiche bien sans ? peut-être parce qu'il n'est pas représentable dans ta locale et qu'iconv choisit tout seul UTF-8.
    Pas de problème de toute façon à laisser le "-t UTF-8" partout.
    J'ai testé avec le head et le tail, ça fonctionne moins bien que le dd
    Oui, head et tail s'attendent à du texte ascii ou a du texte dans ta locale courante mais tu as un fichier où plusieurs codages sont mélangés qu'il est impossible de traiter de manière fiable avec ces outils.
    Je ne connaissait pas la commande dd.
    J'ai pris dd car il travaille au niveau octet et se fiche donc du codage éventuel.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Finalement j'ai encore un problème. Voici le code utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var_nb_element=4
    var_taille=64
    var_count=64
     
    > fichier
    j=0
    while [ $j -lt $var_nb_element ]
    do
    	printf "\"%s\";\n" "$(dd if=elements.txt bs=1 skip=$[j*$var_taille] count=$var_count 2>/dev/null | iconv -f GB18030 -t UTF-8)" >> fichier
    	j=`expr $j + 1`
    done
    Voici le fichier elements.txt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    be 7c 75 70 d9 88 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d7 65 8d 88 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6e 66 1a 90 5a 66 3c 79 0d 67 4b 62 57 59 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 74 87 76 87 0a 54 26 5e 0a 4e 63 88 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    Au lieu d'avoir normalement :
    "精灵裙";
    "旗袍";
    "普通晚礼服手套";
    "蝴蝶吊带上衣";

    J'ai le résultat suivant:
    "緗up賵";
    "譭崍";
    "nf怹f<y
    gKbWY";
    "t噕";

    Dans la 1ère ligne, il y a toujours des lettres.
    Dans la 2ème, on vois que les caractères ne sont pas les bons
    Dans la 3ème et la 4ème on peut voir que les caractères de retour chariot (0d et 0a) pose problème.

    Il faut sans doute prendre autre chose que GB18030 pour iconv, mais comment savoir ?

    [Edit]Après vérification dans le fichier:

    Correspond à "Robe de fée" dans mon 1er post (c'est 精灵裙 dans ce dernier test) :
    Correspond à 精灵裙 dans mon 1er post:
    Les 2 correspondent pourtant bien au même nom en chinois: 精灵裙

    iconv marche correctement avec GB18030 pour le 2ème.
    Il faudrait trouver le bon codage à utiliser pour le 1er. Il reste à savoir lequel...
    Dernière modification par Invité ; 05/12/2012 à 00h20.

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    C'est de l'unicode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat convert
    #!/bin/ksh
    nb_element=4
    taille=64
    for ((i=0; i< nb_element; i++)); do
    	printf "champs %d, offset %d, \"%s\";\n" $i $((i*taille)) "$(dd if=elements.txt bs=1 skip=$((i*taille)) count=$taille 2>/tmp/null | iconv -f UNICODE -t UTF-8)" 
    done > fichier
    $ ./convert

    $ cat fichier
    champs 0, offset 0, "精灵裙";
    champs 1, offset 64, "旗袍";
    champs 2, offset 128, "普通晚礼服手套";
    champs 3, offset 192, "蝴蝶吊带上衣";

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Encodage] Problème encodage caractères chinois avec formulaire
    Par skyppon13 dans le forum Langage
    Réponses: 1
    Dernier message: 13/10/2010, 22h22
  2. [IB6]Problème avec caractères accentués
    Par gandf dans le forum InterBase
    Réponses: 5
    Dernier message: 07/04/2007, 10h43
  3. Problème avec caractère spéciaux
    Par zooffy dans le forum ASP
    Réponses: 5
    Dernier message: 28/02/2007, 10h06
  4. [MySQL] Problèmes avec caractères spéciaux
    Par brokengillou dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 27/04/2006, 17h02
  5. [JEditorPane] Problème avec caractère accentué
    Par scifire dans le forum Composants
    Réponses: 6
    Dernier message: 14/09/2005, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo