Forum Programmation.c++ Exploration système de fichier en UTF8 & accès MySQL ?

Posté par  (site web personnel) . Licence CC By‑SA.
1
20
août
2015

Salut à tous,

J'ai déjà de bonne bases en C++. C'est le seul langage de programmation que maîtrise réellement.

Je cherche à programmer un logiciel d'indexation spéciale, un truc qui n'existe pas encore, je vous le garanti ! Lorsque j'aurai terminé, il s'agira d'un démon qui tournerais sur un NAS. Ce NAS proposerait par ailleurs une application web basé sur cette indexation. Et tout sera en GPL.

J'ai commencé à programmer l'indexation en elle-même en PHP mais c'est beaucoup trop lent. J'ai l'espoir qu'en C++, cela ira beaucoup plus vite. Pour l'utilisateur, il s'agira toujours d'une application web en PHP qui consultera la bd MySQL.

Mais la difficulté, c'est de manipuler en C++ des noms de fichiers et répertoire en UTF8. Je pense devoir utiliser des librairies supplémentaires à celles proposer par C++. Pareil pour accéder à MySQL.

Je dois pouvoir explorer une arborescence, dont les noms sont en UTF8. Je dois pouvoir faire des opération de ("nettoyage"?) recherche, de découpage, etc. sur des chaînes de caractère Unicode (UTF8?).

Je dois pouvoir me connecter à une base de donnée MySQL, préparer des requêtes paramétriques et le exécuter, certains champ étant en UTF8 bien entendu.

Pourriez-vous donc ici me conseiller la bonne manière de faire ça en C++ ("moderne" et sous GNU/Linux) ?

Merci d'avance.

  • # c++11 , boost ou QT

    Posté par  . Évalué à 2.

    Salut
    pour développer en C++ tu devrais utiliser C++11 boost ou Qt

    dans c++11 une grande partie des objets boost ont été intégrés.
    l'objet std::string gère l'encodage utf8

    Avec Qt le développement est vraiment facile
    * Qt creator intègre est un bon IDE, mais tu n'es pas obligé de l'utiliser
    * la doc Qt est vraiment très bien faite.
    * mais il faut faire gaffe aux licences de Qt

    • [^] # Re: c++11 , boost ou QT

      Posté par  . Évalué à 1.

      Il s'agirait plutôt d'utiliser les std::wstring avec les std::wchar non ?

  • # Pourquoi résoudre un problème qui n'existe peut-être pas?

    Posté par  . Évalué à 4.

    C'est le seul langage de programmation que maîtrise réellement.

    C'est une affirmation présomptueuse… Je ne sais pas si beaucoup de gens sur Terre maîtrisent réellement C++..

    Je pense devoir utiliser des librairies supplémentaires à celles proposer par C++.

    Sans exemple, c'est difficile de voir où pourraient être les problèmes potentiels. Sans être un expert des std::string, il me semble que l'encodage n'est pas pris en compte ; l'objet stocke et manipule des char, on y met ce qu'on veut. Du coup, il ne faut pas être surpris si string.length() ne renvoie pas le nombre de charactères affichés, puisqu'on aura le nombre de char utilisés, mais à part ça, sans identifier de problèmes spécifiques, rien ne semble disqualifier la STL pour traiter ce genre de données…

    • [^] # Re: Pourquoi résoudre un problème qui n'existe peut-être pas?

      Posté par  (site web personnel, Mastodon) . Évalué à 3.

      C'est une affirmation présomptueuse… Je ne sais pas si beaucoup de gens sur Terre maîtrisent réellement C++..

      « J'ai toujours souhaité que mon ordinateur soit aussi simple à utiliser que mon téléphone. C'est malin, maintenant je ne sais plus me servir de mon téléphone. »

    • [^] # Re: Pourquoi résoudre un problème qui n'existe peut-être pas?

      Posté par  (site web personnel) . Évalué à 1.

      Je ne souhaite pas être présomptueux. Je souhaite juste préciser que j'étudie et utilise le C++ depuis 1995. Nous devons tous convenir que le C++ est un langage complexe et très riche, que très peu de personnes maîtrisent totalement (y en a-t-il seulement une ? Bjarne ?), d'autant si l'on considère ses évolutions, que je suis avec passion également :)

      En ce qui me concerne, je pense maîtriser assez bien le C++, tant que faire se peut, mais d'aucune manière comparable aucun autre langage.

      Je programme un peu en PHP mais je dois régulièrement faire des recherches pour des choses "simples" ou "élémentaires"… Pareil pour Bash et SQL.

      • [^] # Re: Pourquoi résoudre un problème qui n'existe peut-être pas?

        Posté par  . Évalué à 1.

        Je ne souhaite pas être présomptueux.

        C'était une blague, c'est juste que le C++ peut parfois être tellement subtil (et les implémentations du standard légèrement différentes) que «maîtriser» peut être compris un peu différemment de «je suis assez à l'aise avec». Ceci dit, si tu codes en C++ depuis 20 ans, tu as peut-être largement le niveau pour prétendre maîtriser le langage.

  • # bah le seul probleme c'est le C++

    Posté par  . Évalué à 4.

    parce que le filesystem gere l'UTF8,
    la base de données, gere l'UTF8

    donc si ton code sait lire le filesytem,
    stocker une variable,
    et la mettre dans la base de données,
    et plus tard la ressortir

    il n'y pas grand chose de plus à faire

    • [^] # Re: bah le seul probleme c'est le C++

      Posté par  (site web personnel) . Évalué à 4.

      Non, c'est pas si simple car pour toutes sortes d'opérations, il faut des fonctions spécifiquement écrites pour considérer l'UTF8 et la "richesse" de l'unicode :
      - compter le nombre de caractères (différent du nombre d'octets)
      - parcourir caractère par caractère ("lettre par lettre", fussent-elles accentuées en dehors de latin-1 ou de langues non-latines, etc.)
      - savoir s'il s'agit d'une lettre (pouvant composer un mot ou faire partie d'une phrase) ou plutôt un chiffre ou un symbole.
      - découper les mots en considérant toutes sortes de caractères pouvant les séparer, et non plus seulement l'espace, la tabulation, etc.
      - obtenir la version majuscule ou minuscule d'un mot
      - comparer deux chaînes sans considérer la casse des lettres (dans différentes langue, pas uniquement latin-1)
      - comparer sans considérer l'accentuation (même si cela peut porter à confusion parfois)
      - etc.

      Pour tout cela, il existe des séries de fonctions. Mais j'aimerais que l'on me guide vers la librairie qu'il vaut mieux utiliser pour cela, portable, pérenne, bien suivie (l'unicode évolue chaque année), et bien entendu compatible GPL ;) Ou encore, quelle librairie est actuellement utilisée dans dans le logiciels libres les plus en vogues, etc.

      • [^] # Re: bah le seul probleme c'est le C++

        Posté par  . Évalué à 1. Dernière modification le 21 août 2015 à 13:17.

        Tu veux faire une indexation qui se base sur le contenu des fichiers ? Tu sais que solr (prononcer: solar) et sa lib lucene font déjà pas mal de chose dans ce domaine ?

        Il est notamment utilisé dans Cassandra pour faire de la recherche distribuée et rapide dans les contenus textuel. Il est aussi présent dans plein d'autres projets libres.

        • [^] # Re: bah le seul probleme c'est le C++

          Posté par  (site web personnel) . Évalué à 1.

          Non, dans un premier temps, je fais une sorte d'indexation sur le nom des fichiers et leurs chemins (dossiers) uniquement. Mais je souhaite également faire un traitement à partir de là… Hé puis j'aimerais vraiment savoir manipuler des chaînes utf8 en C++ :)

      • [^] # Re: bah le seul probleme c'est le C++

        Posté par  (site web personnel) . Évalué à 1.

        Peut-être une piste : http://grigory.info/UTF8Strings.About.html
        Qu'en pensez-vous ?

        • [^] # Re: bah le seul probleme c'est le C++

          Posté par  . Évalué à 1.

          IL faut que ça s'intègre bien avec les bibliothèques que tu veux utiliser et avec ta db. Sinon tu es reparti pour tout recoder à la main. Genre regex, outils de tokenisation (découpage des mots) et de lemmatisation (identifier les différentes déclinaison d'un même mot).

          Je n'y connais rien en c++ mais plus haut quelqu'un a dit que std::string gère l'UTF8.

          • [^] # Re: bah le seul probleme c'est le C++

            Posté par  . Évalué à 2.

            Je n'y connais rien en c++ mais plus haut quelqu'un a dit que std::string gère l'UTF8.

            ça dépend ce que l'on entent par là, si c'est juste faire un stockage restitution, ça passe sans problème, si tu veux faire tu traitement caractère par caractère, tu risque d'avoir de mauvaise blague (typiquement toupper sur une lettre accentuée); pour cela il vaut mieux utiliser wstring (utf-16), et faire les conversions lors des entrées/sorties, ou prendre un lib (Qt par exemple) qui les gères.

            Il ne faut pas décorner les boeufs avant d'avoir semé le vent

      • [^] # Re: bah le seul probleme c'est le C++

        Posté par  (site web personnel) . Évalué à 1.

        Une bonne piste semble pouvoir être ICU via libicu-dev

        Je suis toujours occupé à investiguer…

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.