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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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