2010-12-04 7 views
6

J'essaye d'écrire un programme en C# qui divisera un fichier vCard (VCF) avec plusieurs contacts en fichiers individuels pour chaque contact. Je comprends que la vCard doit être enregistrée en tant que ANSI (1252) pour la plupart des téléphones mobiles pour les lire.Conversion d'Unicode en Windows-1252 pour vCards

Cependant, si j'ouvre un fichier VCF à l'aide StreamReader puis l'écrire en arrière avec StreamWriter (réglage 1252 comme le format d'encodage), tous les caractères spéciaux comme å, æ et ø sont écrits comme se ?. Sûrement ANSI (1252) supporterait ces caractères. Comment puis-je réparer ça?

Editer: Voici le morceau de code que j'utilise pour lire et écrire le fichier.

private void ReadFile() 
{ 
    StreamReader sreader = new StreamReader(sourceVCFFile); 
    string fullFileContents = sreader.ReadToEnd(); 
} 

private void WriteFile() 
{ 
    StreamWriter swriter = new StreamWriter(sourceVCFFile, false, Encoding.GetEncoding(1252)); 
    swriter.Write(fullFileContents); 
} 

Répondre

12

Vous avez raison en supposant que Windows 1252 prend en charge les caractères spéciaux que vous avez énumérés ci-dessus (pour une liste complète voir le Wikipedia entry).

using (var writer = new StreamWriter(destination, true, Encoding.GetEncoding(1252))) 
{ 
    writer.WriteLine(source); 
} 

Dans mon application de test en utilisant le code ci-dessus, il a produit ce résultat:

Look at the cool letters I can make: å, æ, and ø!

Aucun point d'interrogation à trouver. Est-ce que vous définissez l'encodage lorsque vous le lisez avec StreamReader?

EDIT: Vous devez simplement être en mesure d'utiliser Encoding.Convert pour convertir le fichier VCF UTF-8 dans Windows 1252. Pas besoin de Regex.Replace. Voici comment je le ferais:

// You might want to think of a better method name. 
public string ConvertUTF8ToWin1252(string source) 
{ 
    Encoding utf8 = new UTF8Encoding(); 
    Encoding win1252 = Encoding.GetEncoding(1252); 

    byte[] input = source.ToUTF8ByteArray(); // Note the use of my extension method 
    byte[] output = Encoding.Convert(utf8, win1252, input); 

    return win1252.GetString(output); 
} 

Et voici comment ma méthode d'extension ressemble:

public static class StringHelper 
{ 
    // It should be noted that this method is expecting UTF-8 input only, 
    // so you probably should give it a more fitting name. 
    public static byte[] ToUTF8ByteArray(this string str) 
    { 
     Encoding encoding = new UTF8Encoding(); 
     return encoding.GetBytes(str); 
    } 
} 

vous aussi voudrez probablement add usings to your ReadFile and WriteFile methods.

+0

Je pense que la clé le problème de l'OP est votre dernière question: assurez-vous que 'StreamReader' qui lit le VCF a le jeu d'encodage 1252. –

+0

Je ne définis pas l'encodage lors de la lecture du fichier en utilisant 'StreamReader'. Et j'utilise à peu près le même morceau de code que votre échantillon. Mais le fichier VCF d'entrée est en UTF-8. Pour une raison quelconque, la fonction "Sauvegarde sur MS" de Sony Ericsson enregistre le fichier VCF en UTF-8! – GPX

+0

@GPX: Voir ma mise à jour, je pense que cela devrait résoudre votre problème. – Kredns