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

Algorithmes et structures de données Discussion :

Comment tronquer du japonnais/Coréen/Thai ?


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut Comment tronquer du japonnais/Coréen/Thai ?
    Bonjour tout le monde !

    Voilà, j'ai un problème pour tronquer du texte dans les pays suivant :
    - Japon (Japonnais) : 1 caractère peut aller jusqu'à 4 octets
    - Corée (Coréen) : 1 caractère peut aller jusqu'à 4 octets
    - Thailande (Thai) : 1 caractère peut aller jusqu'à 3 octets

    Que me conseillez-vous pour tronquer une chaine de caractère, sans tronquer l'idéogramme ?
    => Je veux que le dernier "idéogramme" soit complet.


    Pour le Chinois, le Vietnamien et le taiwanais, j'arrive à contrer le problème car un caractère peut aller jusqu'à 2 octets.

    Dans ce cas, j'ai écris une petite procédure delphi :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    function TForm.RenvoieChaineFormatee(Chaine: String;
      NbCaractere: integer): String;
    var
      AsciiVal: Integer;
      Cpt : Integer;
      C: Char;
      DebutIdeogramme : Boolean;
    begin
      Result:= '';
      DebutIdeogramme := True;
      for Cpt := 1 to Length(Chaine) do
      begin
        C := Chaine[Cpt];
        AsciiVal := Ord(C);
        if (AsciiVal > 128) then
        begin
          if DebutIdeogramme then
          begin
            DebutIdeogramme := False;
            if Cpt >= NbCaractere then
              break
            else
              Result := Result + C;
          end
          else
          begin
            DebutIdeogramme := True;
            Result := Result + C;
          end;
        end
        else
          Result := Result + C;
      end;
    end;

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par pepito62 Voir le message
    Voilà, j'ai un problème pour tronquer du texte dans les pays suivant :
    - Japon (Japonnais) : 1 caractère peut aller jusqu'à 4 octets
    - Corée (Coréen) : 1 caractère peut aller jusqu'à 4 octets
    - Thailande (Thai) : 1 caractère peut aller jusqu'à 3 octets
    Tu parles de la taille de l'encodage en UTF8 ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    Non pas spécialement.
    Exemple, ce caractère ㅈ est stocké sur 2 octets.

    Si on lance la fonction length('ㅈ'), elle nous retourne 2.

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par pepito62 Voir le message
    Non pas spécialement.
    Exemple, ce caractère ㅈ est stocké sur 2 octets.

    Si on lance la fonction length('ㅈ'), elle nous retourne 2.
    Heu... oui, tous les caractères UTF8 ne sont pas codés sur le meme nombre d'octets. Ce que je voulais savoir, c'est si tu voulais tronquer "a la fin d'un caractère UTF8" (quelque soit sa taille), ou si tu cherchais quelque chose de plus sophistiqué lié a la langue japonaise, coréene ou thai.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Pour l'UTF8 :
    Le premier octet d'une séquence permet d'en déterminer la longueur. Il suffit de compter le nombre de bits valant un au début. Il est donc possible d'extraire n'importe quelle partie d'une chaîne de caractères sans risque de couper au milieu d'un caractère. Une séquence décrivant un caractère n'apparaît jamais dans une séquence plus longue décrivant un autre caractère comme c'est le cas avec Shift-JIS par exemple.
    Donc, si ton premier caractère est supérieur à 127, il te suffit de vérifier combien de bits sont mis à un dans l'octet pour avoir la taille du caractère UTF-8 en octets. S'il est inférieur ou égal à 127, alors il ne fait qu'un seul octet par convention.

    Tu peux utiliser soit un For avec un masque (méthode lente), ou mieux, une LUT associant pour chaque premier octet possible la longueur adéquate (méthode très rapide, mais demande un précalcul).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    ou, plus simplement un test sur la valeur du 1er octet:

    0-127 : single byte sequence (US-ASCII)
    194-223 : Start of 2-byte sequence
    224-239 : Start of 3-byte sequence
    240-244 : Start of 4-byte sequence

    (source : http://en.wikipedia.org/wiki/UTF-8#Description )
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    Merci, c'est bien ça.

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    ou, plus simplement un test sur la valeur du 1er octet:
    Disons qu'avec simplement 4 tests, tu n'es pas certain que tout ira parfaitement : le codage permet d'aller jusqu'à 8 octets pour un seul caractère (même si ce n'est pas un cas concret à l'heure actuelle, on est d'accord). Donc, appliquer au sens strict le codage (nombre de bits à 1 du premier octet = nombre d'octets du caractère) est plus fiable et plus général... Et permet de se prémunir contre une éventuelle "erreur" de codage d'une application tierce.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    Oui exact, je pars sur ta solution.

  10. #10
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    La méthode ne fonctionne pas.

    Je n'arrive pas à décoder le caractère afin de déterminer sa longueur.

    Le caractère est : ชั่

    J'ai créé un programme Delphi qui me permet de retourner la valeur binaire et hexa, en fonction d'un caractère. Voici le résultat :
    - binaire : 0000 1010 0000 1110 0011 0001
    - hexa : 3594

    Lorsque je fais le même test avec le caractère A, j'ai :
    - binaire : 0100 0001
    - hexa : 65

    Comme quoi mon programme fonctionne correctement.

    J'ai créé un autre post dans la rubrique Delphi, si certain sont interressé. Tous ensemble, on arrivera peut-être à résoudre mon problème
    http://www.developpez.net/forums/d87...japonais-thai/

  11. #11
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par pepito62 Voir le message
    Voici le résultat :
    - binaire : 0000 1010 0000 1110 0011 0001
    - hexa : 3594
    Y a un soucis quelque part:

    binaire(0x3594) = 11 0101 1001 0100

    hexa(1010 0000 1110 0011 0001) = A0E31
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  12. #12
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par pepito62 Voir le message
    Voici le résultat :
    - binaire : 0000 1010 0000 1110 0011 0001
    - hexa : 3594
    Heu... Cela ressemble à de l'Unicode, ça, et non pas à de l'UTF-8...

    En copiant ce caractère, et en le collant dans un éditeur UTF-8, j'obtiens la séquence hexa suivante :
    00000000h: E0 B8 8A E0 B8 B1 E0 B9 88 ; ชั่

    Ce qui ressemble furieusement à trois caractères UTF-8 de 3 octets chacun, codant un caractère complexe (= avec des modifications de type accent, etc.), chose confirmée par l'ajout d'espaces entre chaque caractère UTF-8 : on obtient en effet la séquence "ช ั ่". Après, je ne suis pas capable de te dire à quoi ça correspond et/ou si c'est légitime du point de vue de la langue. En tout cas, en UTF-8, c'est bien trois caractères consécutifs de trois octets chacun.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  13. #13
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Je suis d'accord avec Mac LAK ce n'est pas de l'UTF-8

    En fait, ta séquence binaire semble correspondre à 3 octets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0000 1010 0000 1110 0011 0001
     
       0x0A      0x0E      0x31
    Ce qui ressemble rudement aux caractères U+0E0A (ช) suivi de U+0E31 (กั)

    (le deuxième caractère est un accent à ajouter sur le premier)

    A mon avis, il manque un 4eme octet dans ta séquence pour obtenir : 0x0A 0x0E 0x31 0x0E. Ce qui correspondrait a un encodage DBCS (windows)

    http://fr.wikipedia.org/wiki/Table_d..._Unicode/U0E00
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  14. #14
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    Je n'ai jamais affirmé que c'était de l'utf-8...

    Sinon c'est du thaïlandais et le caractère correspond à 1 consonne et 2 voyelles.

    Dans delphi, lorsque je veux connaitre la longueur de ce caractère. Il me dit 3.

    Et il est vrai que lorsqu'on le décompose, on obtient : ช ั ่

    => Si on revient à mon 1er post, c'est un soucis pour tronquer une chaine.
    Si ma chaine est ชั่ est que je souhaite récupéré le 1er caractère.

    J'aimerais que le programme me retourne ชั่

    Or il me retourne ช car il manque les 2 autres.

    Le problème, c'est que pour un Thailandais, ceci ชั่ ne veut pas dire la même chose que ช.

    Alors il me faut quelques choses, un algo, une méthode...qui me permettrait de me dire que ช ั ่ est inséparable.

  15. #15
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par pepito62 Voir le message
    Je n'ai jamais affirmé que c'était de l'utf-8...
    Ben je te rappelle que le reste du post parlait d'UTF-8, et non pas d'Unicode ou d'UTF-16 ni d'UTF-32...

    Citation Envoyé par pepito62 Voir le message
    Alors il me faut quelques choses, un algo, une méthode...qui me permettrait de me dire que ช ั ่ est inséparable.
    Tant que l'on ne sait pas quel encodage réel tu utilises (je répète, on partait du principe que c'était de l'UTF-8, chose que tu n'avais pas contredite), il ne sera pas possible de t'aider.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  16. #16
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    Euh je ne sais pas comment te fournir cette information.

    Pour effectuer mes tests :
    Je modifie le pays, la langue de windows en thai. (Thailande)

    Ensuite, avec le clavier Microsoft IME, je saisis du texte thai dans une application Delphi. Mais je pourrais aussi bien saisir ce texte dans bloc-note.

    C'est pour ça, utf8 ou pas, je n'en sais rien.

    Que puis-je faire ?

  17. #17
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par pepito62 Voir le message
    C'est pour ça, utf8 ou pas, je n'en sais rien.

    Que puis-je faire ?
    Il faut regarder la documentation de ton controle Delphi. Mais ca m'etonnerai qu'il stocke ses valeurs en utf-8.

    Plus certainement ca doit être du UCS-2 (ou du DBCS).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  18. #18
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    Je ne trouve pas cette information...

    Sinon un truc simple, tu fais un copier de : ชั่

    Tu ouvres bloc-note et tu fait coller.

    Quel est l'encodage par défaut ? A mon avis, ça doit être la même chose côté delphi. Pourquoi bloc-note affiche correctement le caractère ? Aucun format/encodage n'a été précisé jusque la.

    Après oui, lorsque l'on veut sauvegarder le fichier, bloc-note nous dit que le fichier contient des caractères au format unicode et qu'ils seront perdu si on enregistre au format ANSI.

    => Du faite que je ne trouve pas l'encodage des composants delphi.
    Y a t-il un moyen de savoir ?
    - Je suppose que chaque encodage à sa spécificité ? Du coup, si j'insère un caractère spécifique utf8, UCS-2 ou du DBCS. Je verrais celui qui ne passe pas.
    Mais pour cela, il me faudrait les caractères adéquat...

  19. #19
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    Dans le source de Delphi, lorsque j'effectue un copier-coller, il m'insère 3 "caractères".

    * symbole = 1 caractère = 1 consonne
    * les 2 autres caractères signifie les voyelles

    Les 2 caractères qui suivent le symbole apparaissent uniquement si on sélectionne le symbole.
    Voici un imprime écran.



    Par contre, dans les composants delphi. (La zone de saisie) Le symbole complet correspond à 1 seul "caractère".
    Voici un imprime écran.

  20. #20
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Je pense me souvenir que Windows utilise de l'UTF-16 ( donc basé sur UCS-2 ).

    Chaque caractère est donc codé sur 2 octets. Dans le cas des caractères composites (avec accents), je suppose que c'est pareil. Ton caractère composite doit donc être formé de 3 caractères simples, chacun faisant 2 octets. Total : 6 octets

    Non ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. [1.x] Comment tronquer un text de BDD dans le modele ?
    Par Kris13 dans le forum Symfony
    Réponses: 3
    Dernier message: 19/06/2009, 18h34
  2. Comment tronquer un champ?
    Par loic20h28 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 29/01/2008, 16h53
  3. Comment tronquer une date (supprimer les heures)
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 27/01/2006, 15h58
  4. Réponses: 2
    Dernier message: 02/08/2005, 11h33

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