Conversion de chaines de Windows vers Unix

Messages postés
98
Date d'inscription
vendredi 1 septembre 2006
Dernière intervention
24 octobre 2018
- 22 oct. 2018 à 14:42 - Dernière réponse :
Messages postés
98
Date d'inscription
vendredi 1 septembre 2006
Dernière intervention
24 octobre 2018
- 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 ?
Afficher la suite 

Votre réponse

2 réponses

Messages postés
12280
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 novembre 2018
22 oct. 2018 à 20:16
0
Merci
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));
}

Commenter la réponse de Whismeril
Messages postés
98
Date d'inscription
vendredi 1 septembre 2006
Dernière intervention
24 octobre 2018
24 oct. 2018 à 11:03
0
Merci
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.
Commenter la réponse de MGD Software

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.