2009-01-22 5 views
0

J'ai un contrôle FileUpload dans une page Web ASP.NET qui est utilisé pour télécharger un fichier dont le contenu (dans un flux) est traité dans le code C# derrière et affiché sur la page plus tard, en utilisant HtmlEncode. Mais, une partie de cette sortie est en train de se déformer, en particulier le symbole '£' est sorti en tant que caractère de remplacement FFFD Unicode. J'ai suivi cela jusqu'au fichier d'entrée, qui est encodé sous Windows 1252 ('ANSI').Comment puis-je convertir un fichier téléchargé codé 'ANSI' sous Windows 1252 en UTF8 dans .NET?

La question est,

  1. Comment puis-je déterminer si le fichier est codé comme 1252 ou UTF8? Il peut être soit, et

  2. Comment puis-je le convertir en UTF8 s'il est dans Windows 1252, en préservant le symbole £ etc?

J'ai regardé en ligne mais je ne trouve pas de réponse satisfaisante.

Répondre

4

Si vous savez que le fichier est codé avec Windows 1252, vous pouvez ouvrir le fichier avec StreamReader et passer le codage approprié. C'est:

StreamReader reader = new StreamReader("filename", Encoding.GetEncoding("Windows-1252"), true); 

Le « vrai » dit pour définir le codage en fonction des marques d'ordre d'octets à l'avant du dossier, si elles sont là. Sinon, il l'ouvre comme Windows-1252.

Vous pouvez ensuite lire le fichier et, si vous souhaitez convertir en UTF-8, écrire dans un fichier que vous avez ouvert avec ce codage.

La réponse courte à votre première question est qu'il n'y a pas une façon 100% satisfaisante de déterminer l'encodage d'un fichier. S'il existe des marques d'ordre d'octet, vous pouvez déterminer quelle est la saveur d'Unicode, mais sans la nomenclature, vous devez utiliser l'heuristique pour déterminer l'encodage.

Je n'ai pas une bonne référence pour les heuristiques. Vous pourriez rechercher "comment le bloc-notes détermine le jeu de caractères". Je me souviens avoir vu quelque chose à ce sujet il y a quelque temps.

Dans la pratique, j'ai trouvé ce qui suit à travailler pour la plupart de ce que je fais:

StreamReader reader = new StreamReader("filename", Encoding.Default, true); 

La plupart des fichiers que je lis sont ceux que je crée avec StreamWriter de .NET, et ils sont en UTF-8 avec la nomenclature. Les autres fichiers que je reçois sont généralement écrits avec un outil qui ne comprend pas Unicode ou les pages de code, et je le traite comme un flux d'octets, ce que Encoding.Default fait bien.

Questions connexes