2009-04-22 8 views
1

J'ai besoin de convertir un fichier CSV d'iso en UTF-8 pour garder les accents dans la base de données.asp.net convertissant le fichier iso-8859 en utf-8

Les accents français (é, è, ê et similaires) ne sont pas conservés lorsque j'essaie de les traduire en UTF-8, ils sont changés en "?".

Je suis perplexe.

utiliser la fonction suivante pour la traduction:

public static string iso8859ToUnicode(string src) { 

     Encoding iso = Encoding.GetEncoding("iso8859-1"); 

     Encoding unicode = Encoding.UTF8;   

     byte[] isoBytes = iso.GetBytes(src); 

     byte[] unibytes = Encoding.Convert(iso,unicode,isoBytes); 

     char[] unichars = new char[iso.GetCharCount(unibytes,0,unibytes.Length)]; 

     unicode.GetChars(unibytes,0,unibytes.Length,unichars,0); 

     return new string(unichars); 

    } 

Mais il ne semble pas fonctionner correctement. Aidez-moi?

Répondre

5

Je soupçonne fortement que votre chaîne d'origine n'a pas les bonnes valeurs. Je suppose que vous l'avez lu dans le fichier comme s'il s'agissait d'UTF-8.

Pour convertir entre deux encodages, vous ne devriez pas avoir la chaîne en premier lieu - vous devriez essentiellement charger le octets du fichier et appeler Encoding.Convert() cette façon. Sinon, chargez le fichier en utilisant ISO-Latin-1 et enregistrez-le simplement sous UTF-8. Par exemple:

public static void ConvertLatin1ToUtf8(string inputFile, string outputFile) 
{ 
    Encoding latin1 = Encoding.GetEncoding(28591); 
    string text = File.ReadAllText(inputFile, latin1); 
    File.WriteAllText(outputFile, text, Encoding.UTF8); 
} 

ou

public static void ConvertLatin1ToUtf8(string inputFile, string outputFile) 
{ 
    Encoding latin1 = Encoding.GetEncoding(28591); 
    byte[] latinBytes = File.ReadAllBytes(inputFile); 
    byte[] utf8Bytes = Encoding.Convert(latin1, Encoding.UTF8, latinBytes); 
    File.WriteAllBytes(outputFile, utf8Bytes); 
} 
+0

Merci mille fois et demie. Est-ce que je peux haïr les problèmes d'encodage? : P –

+2

Seulement si je peux détester les problèmes de fuseau horaire plus :) –

0

vous pourriez perdre votre encodage lorsque vous déclarez la nouvelle chaîne, ou lorsque vous stockez les données dans le tableau de caractères

+0

je ne devrais pas perdre le codage de cette façon, comme je convertir l'iso en octets, les octets à utf-8 ... À moins est la conversion automatique de caractères au niveau octet que je ne suis pas au courant, il ne devrait pas être le problème. –

0

au lieu de la méthode GetChars(), ne pouvez pas vous appeler juste

unicode.GetString(unibytes); 
Questions connexes