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

C++ Discussion :

C++ encodage Iso latin1,UTF8


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 19
    Points
    19
    Par défaut C++ encodage Iso latin1,UTF8
    Bonjour,
    J'ai 2 fichiers l'un est de type Iso latin1et l'autre de type UTF8

    J'aimerai savoir s'il ya une variable en C++
    qui permettrai de savoir dans quel type d'encodage est "codé" par un fichier passé en parametre? (Iso latin1 ou UTF8)

    ps : s'il ya un exemple d'utilisation ce serait le bienvenue

    Merci de votre aide

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 19
    Points
    19
    Par défaut
    1 idée ?

    C'est vraiment important que je puisse savoir le faire !

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Si le fichier UTF8 commence par un BOM il suffit d'en vérifier la présence. Sinon il y a moyen de deviner l'encodage par une étude statistique des valeurs des octets, mais c'est pas fiable à 100%.

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 19
    Points
    19
    Par défaut
    T'aurait un exemple car en general on utilise les fichiers qui sont codés en ISO latin !

    et je ne vois pas comment je pourrai verifier s'il est de type A ou de type B

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Tu as vérifié si le fichier commence par un BOM (Byte Order Mark, 0xEF 0xBB 0xBF en UTF8) ?

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 19
    Points
    19
    Par défaut
    Je comprenais pas ton "BOM"

    Oui je vais me renseigner et tester

    Je te tiens au courant !

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Decoder en tant qu'UTF-8 un fichier en Latin1 donne generalement une erreur de decodage rapidement.

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 19
    Points
    19
    Par défaut
    Bon me revoila comme j'avais dit je fais des recherches et je vous tiens au courant

    Avant d'avancer j'aurai 2 questions :

    -un char est bien codé sur 1 octet
    -un fichier codé en UTF8 ressemble a quoi?(un fichier classique mais sans accent? )

    voila ce que j'ai fait a approuvé si c'est ok
    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
     
    #ifndef Encodage_H
    #define Encodage_H
    #include <iostream>
    #include <fstream>
    #include<stdio.h>
    #include <string>
    using namespace std;
     
    class Encodage{
     
       public :
        bool FileIsBOM(const char *filename);   
     
     
    };
     
    #endif
    le point cpp
    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
     
       #include "Encodage.h"
     
     
     bool Encodage::FileIsBOM(const char *filename){
                char oData[3];
                char oBom[3];
                oBom[ 0 ] = 239;// -> i
                oBom[ 1 ] = 187;// -> »
                oBom[ 2 ] = 191;// -> ¿
                ifstream ifs(filename);
                strncpy(oData,filename,3);//copie des 3 premiers caracteres du fichier
                for( int i = 0; i < 3; i++ )
                   { if( oData[ i ] != oBom[ i ] ) return false;}
     
                ifs.close();
     
                return true;
            }
    N'ayait pas de pitié

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par kouack Voir le message
    N'ayait pas de pitié
    Ce sera difficile, là tu copies les trois premiers caractères du nom du fichier...

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par zais_ethael Voir le message
    Ce sera difficile, là tu copies les trois premiers caractères du nom du fichier...
    En effet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string line;
                getline(ifs,line);
                string mot(line,0,3);//recuperation du mot

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 19
    Points
    19
    Par défaut
    Quelqu'un saurait comment est constitué un fichier UTF8

    -j'ai l'impression que c'est juste un fichier composé que de caracteres alphabetiques (sans accent, sans ç...)

    c'est ca?

    Sinon quelqu'un aurait un exemple svp c'est important ! Merci

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par kouack Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string line;
                getline(ifs,line);
                string mot(line,0,3);//recuperation du mot
    C'est exactement la même chose mais exprimée autrement.
    C'est dans le contenu du fichier qu'il faut regarder (enfin...).
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool is_utf8(const std::string& filename) {
        std::ifstream file(filename.c_str());
        unsigned char tmp[4];
        std::streamsize size = file.rdbuf()->sgetn(reinterpret_cast<char*>(tmp),3);
        if(size!=3 || tmp[0]!=0xef || tmp[1]!=0xbb || tmp[2]!=0xbf)
            return false;
        return true;
    }
    J'ai testé avec un fichier utf-8 simplement encodé avec notepad++ et ça fonctionne. Mais d'un autre coté, rien ne permet d'affirmer que tous les éditeurs de texte respectent ce header.

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 665
    Points
    5 665
    Par défaut
    Qia,
    Citation Envoyé par zais_ethael Voir le message
    J'ai testé avec un fichier utf-8 simplement encodé avec notepad++ et ça fonctionne. Mais d'un autre coté, rien ne permet d'affirmer que tous les éditeurs de texte respectent ce header.
    Mon expérience montre qu'en fait c'est assez rare, hélas.

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 19
    Points
    19
    Par défaut
    En gros il n'y pas forcement les memes headers sur les editeurs...pff ca aurait était bien !

    Tu pourrais me montrer ton fichier utf8 pour que je vois a quoi cela ressemble et que je puisse le testé ?

    Merci

  15. #15
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut
    Bonjour,

    J'avais environ le même problème que kouack... je cherchais une fonction permettant de déterminer si une chaîne de caractéres était encodée correctement en utf-8 ou pas. Ne l'ayant pas trouver, je l'ai créée d'aprés ces infos.

    Si ça peux vous aider je la poste ici.

    Mais elle est en php. Je vous laisse le soin de la convertir en c++

    Attention: cette fonction ne gére pas le BOM.
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    /**
    @return true si $string est une chaîne de caractères encodées en utf8
    */
    function is_utf8($string){
     
    	// définition de différents masks
    	$e1   = 0x00; // 0xxx xxxx
    	$e1_m = 0x80; // 1xxx xxxx
     
    	$e2   = 0xC0; // 110x xxxx
    	$e2_m = 0xD0; // 111x xxxx
     
    	$e3   = 0xD0; // 1110 xxxx
    	$e3_m = 0xE0; // 1111 xxxx
     
    	$e4   = 0xF0; // 1111 0xxx
    	$e4_m = 0xF8; // 1111 1xxx 
     
    	$inner_byte   = 0x80; // 10xx xxxx
    	$inner_byte_m = 0xC0; // 11xx xxxx
     
    	$bytes = str2ascii($string);
     
    	$is_utf8  = true;
    	$continue = true;
    	$cur = 0;
     
    	while($continue && $cur < count($bytes)){
    		// encodage sur 1 byte ?
    		if($e1 == ($bytes[$cur] & $e1_m)){
    			$cur++;
    		}
    		// encodage sur 2 byte ?
    		elseif($e2 == ($bytes[$cur] & $e2_m)){
    			if(($cur + 2 < count($bytes))  
    			&& ($inner_byte == ($bytes[$cur + 1] & $inner_byte_m))){
    				$cur += 2;
    			}else{
    						$is_utf8  = false;
    						$continue = false;
    			}
     
    		}
    		// encodage sur 3 byte ?
    		elseif($e3 == ($bytes[$cur] & $e3_m)){
    			if( ($cur + 3 < count($bytes))  
    			&& ($inner_byte == ($bytes[$cur + 1] & $inner_byte_m))
    			&& ($inner_byte == ($bytes[$cur + 2] & $inner_byte_m))){
    				$cur += 3;
    			}else{
    						$is_utf8  = false;
    						$continue = false;
    			}
    		}
    		// encodage sur 4 byte ?
    		elseif($e4 == ($bytes[$cur] & $e4_m)){
    			if(($cur + 4 < count($bytes))
    			&& ($inner_byte == ($bytes[$cur + 1] & $inner_byte_m))
    			&& ($inner_byte == ($bytes[$cur + 2] & $inner_byte_m))
    			&& ($inner_byte == ($bytes[$cur + 3] & $inner_byte_m))){
    				$cur += 4;
    			}else{
    				$is_utf8  = false;
    				$continue = false;
    			}
    		}else{
    			$is_utf8  = false;
    			$continue = false;
    		}
    	}
    	return $is_utf8;
    }

  16. #16
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 665
    Points
    5 665
    Par défaut
    Sai,
    Citation Envoyé par kouack Voir le message
    En gros il n'y pas forcement les memes headers sur les editeurs...pff ca aurait était bien !
    S'il y a un header, il doit être le même pour tous.

    Le problème est que très souvent il n'est pas ajouté.

  17. #17
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 19
    Points
    19
    Par défaut
    Merci a tous !

    La ou on est arrivé je suis satisfait par rapport a la complexité du sujet !

    Big up

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

Discussions similaires

  1. Encodage ISO-8859-1 ou UTF8
    Par byrong dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 08/05/2014, 19h21
  2. XMLdocument - ISO et UTF8
    Par superdip dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/09/2007, 13h38
  3. [MySQL] SGBD de iso vers Utf8 sans perte
    Par adr22 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/07/2007, 19h23
  4. Réponses: 5
    Dernier message: 09/11/2006, 16h51
  5. Encodage iso et utf8 ..
    Par questionneuse dans le forum Struts 1
    Réponses: 4
    Dernier message: 16/06/2006, 17h20

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