Conversion de chaines de Windows vers Unix

MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 - Modifié le 22 oct. 2018 à 14:47
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 - 24 oct. 2018 à 11:03
Bonjour,
Je réalise actuellement une sorte de cloud qui synchronise par FTP des fichiers sur un poste Windows avec un répertoire sur un serveur tournant sous Linux.

Pas de problème, tant que le nom des fichiers ne comportent pas de caractères accentués. Ces derniers sont systématiquement transformés en points d'interrogation lorsque j'ouvre le dossier distant avec Filezilla.

Pourtant, avec ce dernier, lorsque je fais un transfert de fichier, les caractères accentués sont conservés (toujours dans Filezilla), et apparaissent correctement si je liste le répertoire dans une page web (avec "Options +Indexes" dans le htaccess). Par contre, il semble que la page d'index par défaut d'Apache convertit ces caractères en %xx pour l'affichage (on les trouve dans le code source de la page), la page étant par défaut en caractères latins. Mais cela prouve qu'elle reconnait bien le caractère.
Donc c'est possible.

A priori, Linux utilise un jeu de caractères UTF-8, alors que Windows utilise Unicode (UTF-16).

J'ai donc essayé pas mal de solutions de conversion trouvées sur le net, mais aucune ne fonctionne.
J'ai entre autres essayé ceci, mais aucun des essais ne fonctionne:
public static string Win2Unix(string WinString, int essai)
{
    string result = WinString;
    switch (essai)
    {
        case 1: // ------------- Essai 1 -------------
        Encoding utf8 = Encoding.UTF8;
        Encoding def = Encoding.Default;
        result = utf8.GetString(Encoding.Convert(def, utf8, def.GetBytes(WinString)));
        break;

    case 2: // ------------- Essai 2 -------------
        byte[] bytes = Encoding.Default.GetBytes(WinString);
        result = Encoding.UTF8.GetString(bytes);
        break;

    case 3: // ------------- Essai 3 -------------
        byte[] utf8Bytes = Encoding.UTF8.GetBytes(WinString);
        result = Encoding.UTF8.GetString(utf8Bytes);
        break;
    }
    return result;
}

En fait, j'ai besoin d'une chaine et non d'un tableau de caractères UTF-8. Je pense que c'est là que le bât blesse, et que la conversion du tableau d'octets en chaine ne se passe pas bien.
Ou alors, les caractères utilisés sous Linux ne sont pas de l'UTF-8.
Si j'utilise UrlEncode, les noms de fichier comportent les %xx lorsque je les liste avec FileZilla ou l'index de la page web. C'est un peu mieux mais pas satisfaisant.

Quelqu'un aurait une solution ?

2 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
22 oct. 2018 à 20:16
Bonsoir

En fait, j'ai besoin d'une chaine et non d'un tableau de caractères UTF-8. Je pense que c'est là que le bât blesse, et que la conversion du tableau d'octets en chaine ne se passe pas bien.
y'a pas de raison, Encoding.Truc.GetString est fait pour.

Ou alors, les caractères utilisés sous Linux ne sont pas de l'UTF-8
peut-être, je sais que de façon général, Unix n'aime pas ni les diacritiques ni les espaces dans les noms de fichiers et de dossier. Pour les diacritiques c'est peut-être du à un formatage sans.
As tu essayé en utf7?

Si l'option d'enlever les accents te conviendrait, alors
/// <summary>
///Méthode qui supprime signes diacritiques, source http://www.developpez.net/forums/d286030/dotnet/langages/csharp/supprimer-accents-lettre
///</summary>
///<param name="stIn"></param>
///<returns></returns>
private string RemoveDiacritics(string stIn)
{
    string stFormD = stIn.Normalize(NormalizationForm.FormD);
    StringBuilder sb = new StringBuilder();

    for (int ich = 0; ich <= stFormD.Length - 1; ich++)
    {
        UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD.Chars[ich]);
        if (uc != UnicodeCategory.NonSpacingMark)
            sb.Append(stFormD.Chars[ich]);
    }

    return (sb.ToString().Normalize(NormalizationForm.FormC));
}

0
MGD Software Messages postés 186 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 23 avril 2022 2
24 oct. 2018 à 11:03
Impossible d'utiliser UTF-7, qui se résume à l'ASCII pur, donc sans aucun accent.
Il n'est pas question de supprimer les accents de la source, puisque le serveur FTP doit refléter les fichiers des répertoires Windows, dont on ne peut interdire décemment les accents dans les noms de dossier et de fichier, puisqu'ils ne sont pas à priori destinés au web.

Ce qui me chagrine, c'est que Filezilla y arrive très bien, donc qu'il est possible d'avoir des noms de répertoires et de fichiers avec des accents sous Linux.

Bien que Filezilla soit Open Source, je me vois mal décortiquer des milliers de lignes pour trouver comment ils font, alors que je pense que la solution est simple. Reste à la trouver.

Pour le moment, je convertis les noms avec UrlEncode à l'aller et UrlDecode au retour. Cela fonctionne bien dans les deux sens avec mon appli. Mais si on veut récupérer les fichiers avec autre chose que mon appli, il faut interpréter les noms de fichiers et les réécrire après le download.
Par exemple,
"Plan mémoire du TES.doc"
est vu sur le serveur comme
"Plan%20m%c3%a9moire%20du%20TES.doc"
. C'est pas très pratique...

Je vais tenter ma chance sur un forum Linux.
0
Rejoignez-nous