Question

Je travaille sur une tâche d'exportation de données qui doit être en mesure d'exporter dans n'importe quelle langue. Toutes les langues qui utilisent des caractères strictement ASCII fonctionnent très bien, mais lorsque je vais pour les exportations de données dans les langues orientales, elle jette l'exception suivante: "Un caractère invalide a été trouvé dans l'en-tête du courrier" avec un peu de recherche, j'ai déterminé que cela était dû à la spécification RFC 2183 qui stipule que "les valeurs de paramètres supérieures à 78 caractères, ou qui contiennent des caractères non ASCII, doivent être codées comme spécifié dans [RFC 2184]

J'ai lu ces deux documents et ils n'étaient pas vraiment une aide. Je comprends qu'il est nécessaire d'envoyer les données dans le codage UTF-8 afin de localiser le fichier. Cependant, cela fait apparaître le nom de fichier téléchargé comme UTF-8 codé. À partir de maintenant, j'encodrai les noms de fichiers en UTF en utilisant les fonctions que je publierai ci-dessous. (Tout cela est en C #, MVC2)

    private static string GetCleanedFileName(string s)
    {
        char[] chars = s.ToCharArray();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < chars.Length; i++)
        {
            string encodedString = EncodeChar(chars[i]);
            sb.Append(encodedString);
        }
        return sb.ToString();
    }

    private static string EncodeChar(char chr)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        StringBuilder sb = new StringBuilder();
        byte[] bytes = encoding.GetBytes(chr.ToString());

        for (int index = 0; index < bytes.Length; index++)
        {
            sb.AppendFormat("%{0}", Convert.ToString(bytes[index], 16));
        }
        return sb.ToString();
    }

Et le fichier est renvoyé dans la fonction suivante:

    [ActionName("FileLoad")]
    public ActionResult FileLoad()
    {
        string fileName = Request["fileName"];

        //Code that contains the path and file type Removed as it doesn't really apply to the question

        FileStream fs = new FileStream(filePath, FileMode.Open);
        return File(fs, exportName, GetCleanedFileName(fileName));
    }

À proprement parler, cela fonctionne. Cependant, le nom de fichier entier finit par être codé par UTF lorsqu'il atteint l'utilisateur. Je cherche un moyen de transmettre ce fichier préexistant à l'utilisateur, de sorte qu'il peut conserver ses caractères non ASCII.

Toute aide est appréciée.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top