none
Conversion de jeux de caractères RRS feed

  • Question

  • Bonjour tout le monde,

    J'ai de temps à autre un problème de conversion de jeux de caractères.

    Mon application lit, dans des fichiers textes, des listes de fichiers d'images, pour les charger dans une liste, afin de charger ensuite les images.

    En général, ça marche bien, mais pour une raison que j'ignore, de temps à autre, dans le répertoire quelques fichiers se retrouvent convertis d'ANSI en UTF8, donc comme l'application attend de l'ANSI, les fichiers d'images dont les noms comportent des caractères accentués ne sont pas chargés.

    Un temps j'ai laborieusement corrigé ça à la main, caractère accentué par caractère accentué. Et puis je me suis dit que la machine était capable de faire ça plus vite que moi.

    private void btnConvertFromUtf_Click(object sender, EventArgs e)
    {
    	string strPath = lblNomFichier.Text;
    	FileInfo fi = new FileInfo(Path.Combine(Application.UserAppDataPath, strPath));
    	string strDir = fi.Directory.FullName;
    	string strPathFichier = Path.Combine(strDir, fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length) + "_1" + fi.Extension);
    	if(fi.Exists)
    	{
    		using (StreamReader sr = new StreamReader(fi.FullName, Encoding.UTF8))
    		{
    			using(StreamWriter sw = new StreamWriter(strPathFichier, true,  Encoding.GetEncoding(1252)))
    			{
    				string input = sr.ReadToEnd();
    				ConvertEncoding(Encoding.UTF8, Encoding.GetEncoding(1252), input);
    				sw.WriteLine(input);
    			}
    		}
    
    	}
    }

    Ce bouton crée dans le même répertoire un fichier avec le même nom que la source mais suivi de "_1", et avec le même contenu mais converti en ANSI.

    Pour la plus grande partie ça marche, mais j'ai repéré une exception : un nom de fichier (donc dans la fonction, une ligne) se termine par un espace, et celui-là passe à la trappe. L'espace était absent de la conversion en UTF8, donc il est absent de la conversion en retour vers ANSI.

    Si c'est la conversion aller qui a perdu l'espace je crains de ne rien y pouvoir, mais ... si ce n'est pas cohérent je veux bien regarder ça de plus près.

    Normalement, si on veut convertir une chaîne de caractères entre UTF8 et ANSI, on gère caractère par caractère en corrigeant la taille occupée selon le jeu de caractères (un octet en ANSI, deux en UTF8). Mais, il me semble que dans la conversion de StreamReader vers StreamWriter, en fournissant le jeu de caractères en argument, on est dispensé de cette gymnastique ?

    À savoir que par acquit de conscience j'ai mis la fonction ConvertEncoding, mais dans une première version je ne l'avais pas mise, et il me semble que ça ne manquait pas.


    • Modifié Gloops dimanche 3 mai 2020 20:10
    dimanche 3 mai 2020 20:00

Réponses

  • Bon, je n'ai pas l'impression que cette affaire inspire grand monde.

    Alors j'ai renommé le fichier litigieux, et je n'ai plus eu de problème.

    • Marqué comme réponse Gloops lundi 25 mai 2020 16:34
    lundi 25 mai 2020 16:34