begin process at 2012 05 27 14:59:37
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > CONVHTML : UN UTILITAIRE DE CONVERSION POUR FICHIERS HTML

CONVHTML : UN UTILITAIRE DE CONVERSION POUR FICHIERS HTML


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Application Classé sous :html, conversion, caractères spéciaux, fichiers, utilitaire Niveau :Débutant Date de création :26/11/2011 Vu / téléchargé :1 924 / 67

Auteur : pgl10

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
On peut créer ou modifier le fichier html d'une page web avec le Bloc-note, Wordpad ou un autre traitement de texte. Cela ne pose plus de problème pour les visiteurs français. Mais pour être vu, avec un affichage correct, quand on utilise Internet Explorer ou un autre afficheur en version américaine ou d'un autre pays étranger il faut convertir les caractères spéciaux. Ceci est fastidieux avec un traitement de texte. Convhtml effectue automatiquement les conversions de 26 caractères spéciaux pour tous les fichiers html contenus dans le dossier où on en met une copie. Ainsi, on maitrise bien les conversions faites. Il est rapide et systématique.

Source

  • #include <ctime>
  • #include <string>
  • #include <fstream>
  • #include <sstream>
  • #include <iostream>
  • #include <windows.h>
  • int main() {
  • WIN32_FIND_DATA File;
  • HANDLE hSearch;
  • std::cout << std::endl;
  • hSearch=FindFirstFile("*.*", &File); // début de la recherche de fichiers
  • if(hSearch == INVALID_HANDLE_VALUE) {
  • std::cout << "Il n'y a aucun fichier !" << std::endl << std::endl; // ??
  • system("pause");
  • return -1;
  • }
  • do { // pour chaque fichier du dossier courant
  • char buf[133], *p;
  • BOOL ok;
  • int nc;
  • strcpy(buf, File.cFileName);
  • nc = strlen(buf);
  • while((p=strchr(buf, '.')) != NULL) strcpy(buf, p+1); // buf : type du fichier
  • ok=false;
  • if(strcmp(buf, "htm") ==0) {ok=true; nc=nc-4;}
  • if(strcmp(buf, "html")==0) {ok=true; nc=nc-5;}
  • if(ok && nc > 0) {
  • std::cout << "Traitement de : " << File.cFileName << std::endl;
  • std::ifstream input(File.cFileName); // traitement de ce fichier
  • if(input) {
  • std::string fichout;
  • std::ostringstream tmpflx;
  • tmpflx << File.cFileName << "_tmp" << time(0); // fichier temporaire
  • fichout = tmpflx.str(); // à nom unique
  • std::ofstream output(fichout.c_str());
  • if(output) {
  • std::string::size_type i0, i1;
  • std::string li; // li : ligne lue puis ligne traitée
  • while(std::getline(input, li)) { // volontairement on ne convertit
  • do { // pas les 4 caractères : & " < >
  • ok=true;
  • i0=std::string::npos;
  • i1=li.find('¤'); if(i1!=i0) {li.replace(i1,1,"&euroc;"); ok=false;}
  • i1=li.find('½'); if(i1!=i0) {li.replace(i1,1,"&oelig;"); ok=false;}
  • i1=li.find('©'); if(i1!=i0) {li.replace(i1,1,"&copy;"); ok=false;}
  • i1=li.find('°'); if(i1!=i0) {li.replace(i1,1,"&deg;"); ok=false;}
  • i1=li.find('Ç'); if(i1!=i0) {li.replace(i1,1,"&Ccedil;"); ok=false;}
  • i1=li.find('È'); if(i1!=i0) {li.replace(i1,1,"&Egrave;"); ok=false;}
  • i1=li.find('É'); if(i1!=i0) {li.replace(i1,1,"&Eacute;"); ok=false;}
  • i1=li.find('×'); if(i1!=i0) {li.replace(i1,1,"&times;"); ok=false;}
  • i1=li.find('à'); if(i1!=i0) {li.replace(i1,1,"&agrave;"); ok=false;}
  • i1=li.find('â'); if(i1!=i0) {li.replace(i1,1,"&acirc;"); ok=false;}
  • i1=li.find('ä'); if(i1!=i0) {li.replace(i1,1,"&auml;"); ok=false;}
  • i1=li.find('æ'); if(i1!=i0) {li.replace(i1,1,"&aelig;"); ok=false;}
  • i1=li.find('ç'); if(i1!=i0) {li.replace(i1,1,"&ccedil;"); ok=false;}
  • i1=li.find('è'); if(i1!=i0) {li.replace(i1,1,"&egrave;"); ok=false;}
  • i1=li.find('é'); if(i1!=i0) {li.replace(i1,1,"&eacute;"); ok=false;}
  • i1=li.find('ê'); if(i1!=i0) {li.replace(i1,1,"&ecirc;"); ok=false;}
  • i1=li.find('ë'); if(i1!=i0) {li.replace(i1,1,"&euml;"); ok=false;}
  • i1=li.find('î'); if(i1!=i0) {li.replace(i1,1,"&icirc;"); ok=false;}
  • i1=li.find('ï'); if(i1!=i0) {li.replace(i1,1,"&iuml;"); ok=false;}
  • i1=li.find('ñ'); if(i1!=i0) {li.replace(i1,1,"&ntilde;"); ok=false;}
  • i1=li.find('ô'); if(i1!=i0) {li.replace(i1,1,"&ocirc;"); ok=false;}
  • i1=li.find('ö'); if(i1!=i0) {li.replace(i1,1,"&ouml;"); ok=false;}
  • i1=li.find('÷'); if(i1!=i0) {li.replace(i1,1,"&divide;"); ok=false;}
  • i1=li.find('ù'); if(i1!=i0) {li.replace(i1,1,"&ugrave;"); ok=false;}
  • i1=li.find('û'); if(i1!=i0) {li.replace(i1,1,"&ucirc;"); ok=false;}
  • i1=li.find('ü'); if(i1!=i0) {li.replace(i1,1,"&uuml;"); ok=false;}
  • }while(!ok);
  • output << li + "\n";
  • }
  • }
  • output.close();
  • input.close();
  • remove(File.cFileName); // fin du fichier à traiter
  • rename(fichout.c_str(), File.cFileName); // nouveau fichier traité
  • }
  • }
  • }while(FindNextFile(hSearch, &File));
  • FindClose(hSearch); // fin de la recherche de fichiers
  • std::cout << std::endl << std::endl;
  • std::cout << "C'est fini !";
  • std::cout << std::endl << std::endl;
  • system("pause");
  • return 0;
  • }
#include <ctime>
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include <windows.h>
int main() {
    WIN32_FIND_DATA File;
    HANDLE hSearch;
    std::cout << std::endl;
    hSearch=FindFirstFile("*.*", &File);           // début de la recherche de fichiers
    if(hSearch == INVALID_HANDLE_VALUE) {
        std::cout << "Il n'y a aucun fichier !" << std::endl << std::endl;       //  ??
        system("pause");
        return -1;
    }
    do {                                      // pour chaque fichier du dossier courant
        char buf[133], *p;
        BOOL ok;
        int nc;
        strcpy(buf, File.cFileName);
        nc = strlen(buf);
        while((p=strchr(buf, '.')) != NULL) strcpy(buf, p+1);  // buf : type du fichier 
        ok=false;
        if(strcmp(buf, "htm") ==0) {ok=true; nc=nc-4;}
        if(strcmp(buf, "html")==0) {ok=true; nc=nc-5;}
        if(ok && nc > 0) {
            std::cout << "Traitement de : " << File.cFileName << std::endl;
            std::ifstream input(File.cFileName);            // traitement de ce fichier
            if(input) {
                std::string fichout;
                std::ostringstream tmpflx;
                tmpflx << File.cFileName << "_tmp" << time(0);    // fichier temporaire
                fichout = tmpflx.str();                           // à nom unique
                std::ofstream output(fichout.c_str());
                if(output) {
                    std::string::size_type i0, i1;
                    std::string li;                // li : ligne lue puis ligne traitée
                    while(std::getline(input, li)) {  // volontairement on ne convertit
                        do {                          // pas les 4 caractères : & " < >
                            ok=true;
                            i0=std::string::npos;
                            i1=li.find('¤'); if(i1!=i0) {li.replace(i1,1,"&euroc;");  ok=false;}
                            i1=li.find('½'); if(i1!=i0) {li.replace(i1,1,"&oelig;");  ok=false;}
                            i1=li.find('©'); if(i1!=i0) {li.replace(i1,1,"&copy;");   ok=false;}
                            i1=li.find('°'); if(i1!=i0) {li.replace(i1,1,"&deg;");    ok=false;}
                            i1=li.find('Ç'); if(i1!=i0) {li.replace(i1,1,"&Ccedil;"); ok=false;}
                            i1=li.find('È'); if(i1!=i0) {li.replace(i1,1,"&Egrave;"); ok=false;}
                            i1=li.find('É'); if(i1!=i0) {li.replace(i1,1,"&Eacute;"); ok=false;}
                            i1=li.find('×'); if(i1!=i0) {li.replace(i1,1,"&times;");  ok=false;}
                            i1=li.find('à'); if(i1!=i0) {li.replace(i1,1,"&agrave;"); ok=false;}
                            i1=li.find('â'); if(i1!=i0) {li.replace(i1,1,"&acirc;");  ok=false;}
                            i1=li.find('ä'); if(i1!=i0) {li.replace(i1,1,"&auml;");   ok=false;}
                            i1=li.find('æ'); if(i1!=i0) {li.replace(i1,1,"&aelig;");  ok=false;}
                            i1=li.find('ç'); if(i1!=i0) {li.replace(i1,1,"&ccedil;"); ok=false;}
                            i1=li.find('è'); if(i1!=i0) {li.replace(i1,1,"&egrave;"); ok=false;}
                            i1=li.find('é'); if(i1!=i0) {li.replace(i1,1,"&eacute;"); ok=false;}
                            i1=li.find('ê'); if(i1!=i0) {li.replace(i1,1,"&ecirc;");  ok=false;}
                            i1=li.find('ë'); if(i1!=i0) {li.replace(i1,1,"&euml;");   ok=false;}
                            i1=li.find('î'); if(i1!=i0) {li.replace(i1,1,"&icirc;");  ok=false;}
                            i1=li.find('ï'); if(i1!=i0) {li.replace(i1,1,"&iuml;");   ok=false;}
                            i1=li.find('ñ'); if(i1!=i0) {li.replace(i1,1,"&ntilde;"); ok=false;}
                            i1=li.find('ô'); if(i1!=i0) {li.replace(i1,1,"&ocirc;");  ok=false;}
                            i1=li.find('ö'); if(i1!=i0) {li.replace(i1,1,"&ouml;");   ok=false;}
                            i1=li.find('÷'); if(i1!=i0) {li.replace(i1,1,"&divide;"); ok=false;}
                            i1=li.find('ù'); if(i1!=i0) {li.replace(i1,1,"&ugrave;"); ok=false;}
                            i1=li.find('û'); if(i1!=i0) {li.replace(i1,1,"&ucirc;");  ok=false;}
                            i1=li.find('ü'); if(i1!=i0) {li.replace(i1,1,"&uuml;");   ok=false;}
                        }while(!ok);
                        output << li + "\n";
                    }
                }
                output.close();
                input.close();
                remove(File.cFileName);                     // fin du fichier à traiter
                rename(fichout.c_str(), File.cFileName);      // nouveau fichier traité
            }
        }
    }while(FindNextFile(hSearch, &File));
    FindClose(hSearch);                              // fin de la recherche de fichiers
    std::cout << std::endl << std::endl;
    std::cout << "C'est fini !";
    std::cout << std::endl << std::endl;
    system("pause");
    return 0;
}

 Conclusion

Pour l'utiliser il suffit de mettre une copie du fichier convhtml.exe dans le dossier à traiter, puis de le lancer et enfin de l'effacer. C'est tout ! Il reste ensuite à envoyer les fichiers chez l'hébergeur.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE
Source avec Zip Source avec une capture POUR AFFICHER LES CARACTÈRES ACCENTUÉS SOUS WINDOWS EN MODE ...
Source avec Zip Source avec une capture AFFIMOFF : UNE VISIONNEUSE 3D AVEC PARAMÉTRISATION ET TEXTUR...
Source avec Zip Source avec une capture CRIBLE D'ERATOSTHÈNE OPTIMISÉ
Source avec Zip Source avec une capture UN INTERPRÉTEUR POUR RATIONNELS DE GRANDES TAILLES

 Sources de la même categorie

Source avec Zip Source avec une capture PROGRAMME DE SUDOKU par AffreuxJojp
Source avec Zip EVALUATEUR D'EXPRESSION ARITHMÉTIQUE par matrx180vTitanium
Source avec Zip Source avec une capture QBIBLIO GESTION DES PRÊTS par conatic
Source avec Zip Source avec une capture QL-CHATROOM V 1.0 par mature
Source avec Zip Source avec une capture GEOLOCALISATION par ganjarasta

 Sources en rapport avec celle ci

CONVERSION DE FICHIER EN FICHIER BMP par seoseo
DATETIMECONVERTER par guill76
Source avec Zip COPIE DE FICHIERS PAR RESEAU LOCAL par cczerty
Source avec Zip [MYLIB] GESTION DE FICHIERS par Galaad2908
Source avec Zip Source avec une capture [C++] BASE64CONVERTER V1.1, UN ENCODEUR DÉCODEUR EN BASE64 par ordiman85

Commentaires et avis

Commentaire de pgl10 le 27/11/2011 21:55:30

Pour ceux qui préfèrent cela, on peut aussi écrire :
char ch[26] = {'¤','½','©','°','Ç', ... 'û','ü'};
std::string st[26] = {"&euroc;","&oelig;","&copy;","&deg;","&Ccedil;", ... ,"&ucirc;","&uuml;"};              
for(int k=0; k<26; k++) {i1=li.find(ch[k]);  if(i1!=i0) {li.replace(i1,1,st[k]); ok=false;} }

Commentaire de Jojo Lancien le 28/11/2011 08:50:11 10/10

J'avais toujours eu la flemme de mettre en correspondance les caractères spéciaux avec leur code HTML.
Ce petit utilitaire me parait une bonne idée.  Je vais le tester (avec ou sans la simplification de PGL10) et je rependrai peut-être la séquence dans d'autres utilitaires de génération d'HTML.

Commentaire de LeFauve42 le 28/11/2011 11:34:02

...Ou alors il suffit de spécifier dans l'entête du fichier le type d'encodage utilisé...
Sinon pour ce genre de programmes, pourquoi utiliser quelque chose comme C++ alors que des outils dédiés comme awk font ça très bien en quelques lignes ?

Commentaire de pgl10 le 28/11/2011 13:20:48

@Jojo Lancien : merci pour ce commentaire. C'est bien vrai que maîtriser complètement tout traitement automatique est toujours quelquechose de très satisfaisant.
@LeFauve42 : cette information m'intrigue. Pour ceux, comme moi, qui ne connaissent pas cette solution en awk il serait intéressant d'avoir ici un peu plus d'informations au sujet de cet outil dédié.

Commentaire de LeFauve42 le 28/11/2011 14:45:50

AWK est un outil destine a ecrire rapidement des scripts prenant des fichiers texte en entree et generant des fichiers textes modifies en sortie.
C'est le cas le plus general, mais on peut faire beaucoup plus (certains ont par exemple ecrit des compilateurs en AWK).
Il a ete cree en 1977, donc ce n'est pas nouveau mais ca fonctionne toujours et ca reste le moyen le plus rapide de faire des choses simples avec des fichiers.
Si tu veux tester, je te recommande la version de GNU (gawk.exe) qui comporte quelques ameliorations en plus. Google te permettra de trouver la doc en ligne, ainsi que des exemples de code.
Les principaux avantages sont :
- Pas la peine de gerer les ouvertures/fermetures de fichier
- Support natif des expressions regulieres
- Une syntaxe tres proche du C

Commentaire de pgl10 le 28/11/2011 15:48:04

LeFauve42 : merci pour ces explications bien claires sur AWK. Il y a tellement d'outils à connaître : C, C++, STL, Qt, OpenGL, et beaucoup d'autres ... ! On ne sait plus ceux qu'il faut apprendre. Mais là, AWK est une remarque très appropriée. Je suis content que mon programme a permis ce rappel. Remerciements.

Commentaire de Kmaschta le 28/11/2011 15:48:44

Petite précision, pour éviter de mettre "std::", suffit de préciser "using namespace std;" après les inclusions.

Commentaire de rojbisami le 30/11/2011 16:27:34

Au lieu de remplacer ces caractères spéciaux, vous pouvez ajouter dans la partie <head> de votre page, la ligne suivante:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
qui indique le système de codage de caractères à utiliser, ici Français latin.

Vous pouvez également utiliser l'unicode. Encore plus intéressant dans le cas d'utilisation de plusieurs langues.
Amicalement

Commentaire de LeFauve42 le 30/11/2011 17:14:49

> Au lieu de remplacer ces caractères spéciaux, vous pouvez ajouter dans la
> partie <head> de votre page, la ligne suivante:

C'est ce dont je parlais dans mon premier post :o).

J'ajouterais deux remarques sur cette methode :
- Si vous avez le choix, utilisez plutot UTF-8 comme encodage plutot que le vieillissant iso-latin-1
- Notez que ce meta tag n'est pas prioritaire pour le navigateur. Si par hasard votre hebergeur a configure son serveur pour retourner un entete HTTP "Content-Type" avec un encodage different du votre, c'est celui-ci qui sera utilise pour decoder les caracteres de la page. (donc, si vous sauvez votre fichier avec le bon encodage (celui correspondant au meta-tag) et que ca ne marche pas, verifiez les headers HTTP renvoyes par le serveur) :o)

Commentaire de CptPingu le 05/12/2011 16:57:49 administrateur CS

@rojbisami: Écrire le code HTML permet de ne pas se soucier de ce genre de problème. Je rapelle que mettre ce header ne résoud pas tous les problèmes. Si tu as enregistré ton fichier dans un encodage X et que tu mets en entête un encodage Y, tu vas avoir pas mal de soucis (et ça arrive souvent de manière involontaire. essaie de différencier à l'oeil nu un fichier en UTF-8 avec et sans bom, ou même un fichier en UTF-8 et en UTF-16...). C'est à mon humble avis une technique très appréciable. pgl10 ne savait pas qu'il existait des outils qui le faisait, mais ça démarche est tout à fait légitime (et si je ne connaissais pas awk ou sed, j'aurais sûrement eu l'usage de son programme).

@Kmaschta: Heu... Juste non ? On évite de mettre des using namespace, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

Commentaire de LeFauve42 le 05/12/2011 17:18:39

CptPingu: Je suis d'accord avec toi sur le principe, mais dans la pratique :
- Si la configuration de l'encoding de la page change de maniere involontaire, ne vaut-il pas mieux s'en apercevoir rapidement (en constatant des caracteres bizares sur l'affichage) qu'attendre que la base de donnee du site soit corrompue avec des enregistrement encodes selon le mauvais format ?
- Si l'encodage du fichier change, je ne suis pas sur que le programme de PGL10 va reconnaitre les caracteres speciaux (ni d'ailleurs une solution en awk ou sed).

Moralite : quelle que soit la methode choisie, ca ne dispense pas de verifier la configuration du serveur et le format d'encodage de vos fichiers :o)

Commentaire de CptPingu le 05/12/2011 17:43:47 administrateur CS

@lefauve42: Ce sont de très bonnes remarques. Néanmoins, je parlais d'un usage assez particulier. Généralement, je convertis mes caractères spéciaux en HTML quasi immédiatement, et si l'encodage change plus tard, vu que j'ai déjà tout en code html, je ne me pose plus la question.
Il existe bien entendu toujours le risque de transformer le fichier en prenant une version dont l'encodage a changé, auquel cas, il y aura effectivement un souci.
Ma méthode n'est pas infaillible à 100% (à moins de toujours utiliser le code html, mais donc plus besoin de convertisseur) et ta remarque reste très pertinente.

>> Moralite : quelle que soit la methode choisie, ca ne dispense pas de verifier la configuration du serveur et le format d'encodage de vos fichiers :o)
Tout à fait ! C'est une très bonne conclusion :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

conversion de fichiers [ par sergio18 ] salutJe fais un projet où je dois faire une conversion du fichier.POur cela le prof qui me suit m'a demandé d'effectuer ds un premier temps une lectur Pb d'impression automatique de fichiers HTML [ par thebiglec ] Bonjour, je dois creer un programme en Visual c++ 6.0 qui  imprime des pages HTML automatiquement. J explique: J'ai un repertoire avec 5 000 pages HTM conversion de fichiers en C. [ par primo177 ] Bonjour tout le monde.J'aimerais savoir svp s'il existe un moyen de convertir un fichier word ( .doc) en uin fichier (.txt).Merci d'avance.C'est vraim recherche fichiers executables et comparaisons [ par limsa033 ] Bonsoir,je cherche à lister tous les fichiers executables d(un disque dur ainsi que leur principales caractéristiques(nom,chemin et taille et date de conversion d'un format png en image bmp [ par REk2002 ] bonjour je cherche un programme simple permettant de convertir une image png en bmp. merci d'avance au revoir aide include [ par Dalamar ] Je travaille sur un petit jeu et j,ai plusieurs fichiers .h. Je suis obligé d'en inclure plusieurs dans les autres fichiers, bref, chaque fichier dépe conversion image tiff à bmp [ par mouss8 ] je voudrais savoir comment récupéré les données dans une image tiff et bmp ou savoir la composition de ces fichiers (en-tete,info image, donné) HELP creation de dossier [ par asnow ] SALUT A TOUS Je voudrais savoir comment ouvrir est integrer des fichiers dans un dossier en C sous dev-C++.Avec cette commande CreateDirectory(nom,NUL CRC + affichage/conversion binaire [ par Ferrari01 ] Bonjour...Est-ce que quelqu'un aurait un petit programme de CRC et/ou un petit programme qui permet d'afficher 4 caractères en binaire (ex.: abcd -&gt Conversion de lib VC++ en lib GCC [ par Nebula ] Salut à tous !Je cherche à me connecter sur un serveur MySQL pour accéder à une base de données (logique implacable...). MySQL 3.23 est livré avec des


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales