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 :

[QST] Détecter un bom UTF-8


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut [QST] Détecter un bom UTF-8
    Bonjour,

    j'utilise un getline pour lire la première ligne d'un fichier.
    Malheureusement, parfois ce fichier est en UTF-8 sans BOM ou UTF-8 avec BOM.

    Le problème est que j'ai une regex qui teste cette première ligne, et le BOM pose problème.

    Je voudrai donc savoir si vous avez une idée de comment détecté ce BOM ?
    Pour l'instant je vais deux test de regex, un avec la ligne complète et un autre avec la ligne moins la trois premier caractère.

    Merci d'avance de voter aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    pourquoi ne pas commencer par lire ces 3 premiers caractères pour voir s'il s'agit d'une signature BOM ou non ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut
    J'ai bien essayé, mais je me retrouve avec "" dans ma string...
    Comment puis-je faire pour testé si il s'agit d'un BOM EF BB BF (trois octet du bom UTF-8) ?

    En faite, comment faire pour lire et testé c'est trois octets ?

  4. #4
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char bom[3];
    std::ifstream ifs(...);
    ifs.read(bom, 3);
    if (bom[0] == 0xEF && bom[1] == 0xBB && bom[2] == 0xBF) {
      // BOM DETECTE
    } else {
      // PAS DE BOM
    }
    (code non testé)

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Puisque tu lis la ligne entière avec getline, et sais skip les 3 premiers octets, comment ne peux-tu pas tester ces 3 octets ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // blabla
    std::string line = getline(); // plus ou moins
    if (line[0] == 0xEF && line[1] == 0xBB && line[2] == 0xBF)
    {
     // wtf BOM spotted !
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut
    Bon voici ma fonction dans l'état actuel (fonctionnel avec le test sur "")
    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
     
    bool isXmlFile(const string& pathfile)
    {
     
    	tr1::regex xmlRegex("<\\?xml\\s*version=\"[1-9]+.\\d*\"\\s*(\\s\\w+=\"[^\"]+\")*\\s*\\?>");
    	ifstream file( pathfile.c_str(), ios::in);
    	bool isXml=false;
     
    	if(file)
    	{
    		string line=string("");
    		getline(file,line);
    		if(line.length()>15){
     
    			//TODO voir si on peux remplacer le test par EF BB BF
    			if(line.substr(0,3)=="")	
    				line=line.substr(3,line.length()-1);
     
    			isXml=tr1::regex_match(line.begin(),line.end(),xmlRegex);
    		}
    		file.close();
    	}
    	return isXml;
    }
    J'ai essayé de remplacer mon test sur "" par le test avec les line[x]==...
    Mais cela ne fonctionne pas.
    Mon debugger me dit que
    line[0]=-17 'ï'
    line[1]=-69 '»'
    line[2]=-65 '¿'

    Donc je ne vois pas du tout ce que je peux faire.


    EDIT: j'ai trouver:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(memcmp(line.c_str(), "\xEF\xBB\xBF", 3)==0){
     // UTF-8 BOM detected
    }
    Merci a tous pour votre aide

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

Discussions similaires

  1. [PHP 5.0] Automatiser utf-8 sans bom --> utf-8 avec bom
    Par ikki67 dans le forum Langage
    Réponses: 1
    Dernier message: 09/02/2015, 04h17
  2. Spool avec paramètre sur l'encodage en utf-8 sans BOM
    Par saidna123 dans le forum Oracle
    Réponses: 5
    Dernier message: 02/05/2013, 10h04
  3. [2K5] BULK INSERT / BCP / Unicode / BOM / UTF-16
    Par mioux dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/11/2009, 15h11
  4. [BOM] Supprimer le BOM d'un xml en UTF-8
    Par kij dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 22/11/2007, 11h46
  5. [XHTML] Problème de Unicode Byte-Order Mark (BOM) in UTF-8 (?)
    Par gb-ch dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 13/02/2007, 02h01

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