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 :

Ouvrir un fichier dont le chemin contient des caratères chinois


Sujet :

C++

  1. #1
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut Ouvrir un fichier dont le chemin contient des caratères chinois
    Bonjour,

    J'ai une appli Qt qui est distribué en Chine. Pas de souci avec les fonctions Qt gérant les fichiers, cela semble transparent. Mais le code contient du langage C et là ça coince.
    Par exemple ouvrir un fichier dont le chemin contient de caractères chinois ne fonctionne pas avec la simple fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FILE *f=fopen(fichier.toStdString().c_str(),"rt");
    Comment puis-je m'en sortir, sachant qu'il n'est pas possible de remplacer l'ensemble du code C par du Qt

    Merci de votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 760
    Par défaut
    Si tu es sous Windows, il faut utiliser l'API de Windows, avec les wchar

    Documentation _wopen

  3. #3
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    En fait, l'appli tourne aussi sous linux et mac. Alors les API Windows sont exclues.

  4. #4
    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
    Pour ta version windows si tu utilises une API qui gère pas l'encodage, tu dois utiliser unicode, qui est l'utilisation de wchar_t et fonctions spécifiques.
    Sinon tu as sans le moindre doute un octet nul dans ta chaîne chinoise et forcément c'est interprété comme un caractère de fin de chaîne et de nom de fichier, inexistant.
    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.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    fopen() n'est pas utilisable sous Windows s'il y a des caractères autres que ASCII-7bits. Si le code doit fonctionner sous plusieurs environnements, Qt sait gérer. Sinon seule possibilité utiliser de la compilation conditionnelle pour avoir du code dépendant du système d'exploitation.
    Le problème est surtout au moment de l'ouverture. On devrait pouvoir ouvrir le fichier avec QFile en remplaçant le FILE*fichier=fopen( nomFichier,"rb") par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        QFile qFile( nomFichier );
        qFile.open( QIODevice::ReadOnly );
        int fileDescriptor = qFile.handle();
        FILE* fichier = fdopen( dup(fileDescriptor) , "rb" );
    Le dup() permet de pouvoir faire close(fichier) qui sinon entre en conflit avec le close qui se fait à la destruction du QFile.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    A mon avis, le dup permet surtout de faire un fdopen sur un fichier déjà ouvert.

  7. #7
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Merci pour toutes vos remarques et suggestions et vais essayer celle proposée à base de Qt. Pour ma part, j'ai expérimenté une solution compatible Windows ci-dessous qui fonctionne semble t-il très bien, mais que sous Windows.

    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
     
    FILE *xfopen(std::string filePath,std::string mode)
    {
      FILE *f;
      std::wstring filePathW,modeW;
      filePathW.resize(filePath.size());
      int newSize = MultiByteToWideChar(CP_UTF8, 0, filePath.c_str(), filePath.length(), const_cast<wchar_t *>(filePathW.c_str()), filePath.length());
      filePathW.resize(newSize);
     
      modeW.resize(mode.size());
      newSize = MultiByteToWideChar(CP_UTF8, 0, mode.c_str(), mode.length(), const_cast<wchar_t *>(modeW.c_str()), mode.length());
      modeW.resize(newSize);
      f = _wfopen(filePathW.c_str(),modeW.c_str());
      return(f);
    }

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Autre question, tu ne peux pas utiliser un fstream ou un wfstream?

  9. #9
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Si bien sur je pourrais utiliser cette voie, mais cela m'imposerait de réécrire l'ensemble de code en C. Ce qui serait une tache gigantesque.
    J'ai fini par opter pour la solution suivante, pas forcément élégante mais qui fonctionne à moindre effort:

    J'ai définie une fonction xfopen(string file, string mode) capable donc d'ouvrir des chemins de fichiers incluant des caractères spéciaux.
    Et j'ai mis un #define fopen xfopen général au code.

    Ca fonctionne très bien sur les 3 OS.

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

Discussions similaires

  1. [XL-2010] Ouvrir un fichier dont le chemin variable est stocké dans une cellule.
    Par Binarys dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/03/2017, 10h35
  2. Réponses: 11
    Dernier message: 04/06/2014, 14h09
  3. Ouvrir fichier dont le nom contient espace
    Par laetisam dans le forum Général Java
    Réponses: 3
    Dernier message: 15/05/2012, 10h27
  4. Ouvrir fichier dont le nom contient des parenthèses
    Par Alphonse87 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 26/03/2010, 09h35
  5. Réponses: 8
    Dernier message: 23/05/2008, 12h37

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