2010-12-04 9 views
6

Estoy tratando de escribir un programa en C# que dividirá un archivo vCard (VCF) con múltiples contactos en archivos individuales para cada contacto. Entiendo que la vCard debe guardarse como ANSI (1252) para que la mayoría de los teléfonos móviles los lean.Conversión de Unicode a Windows-1252 para vCards

Sin embargo, si abro un archivo VCF usando StreamReader y después grabarla con StreamWriter (ajuste de 1252 como el formato de codificación), todos los caracteres especiales como å, æ y ø se están escritos como ?. Seguramente ANSI (1252) apoyaría estos caracteres. ¿Cómo puedo solucionar esto?

Edit: Aquí está el fragmento de código que uso para leer y escribir el archivo.

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); 
} 

Respuesta

12

Tiene usted razón en el supuesto de que Windows-1252 es compatible con los caracteres especiales que se enumeran más arriba (para una lista completa ver el Wikipedia entry).

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

En mi aplicación de prueba utilizando el código anterior se produce este resultado:

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

No hay signos de interrogación que se encuentran. ¿Estás configurando la codificación cuando la lees con StreamReader?

EDIT: Usted sólo debe ser capaz de utilizar Encoding.Convert para convertir el archivo VCF UTF-8 a Windows-1252. No es necesario para Regex.Replace. Así es como yo lo haría:

// 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); 
} 

Y aquí es cómo mi método de extensión se ve:

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); 
    } 
} 

También es probable que desee a add usings to your ReadFile and WriteFile methods.

+0

Creo que la clave para el problema del OP es tu última pregunta: asegúrate de que el 'StreamReader' que lee el VCF tenga el conjunto de codificación 1252. –

+0

No estoy configurando la codificación al leer el archivo usando 'StreamReader'. Y estoy usando el mismo código que tu muestra. Pero el archivo VCF de entrada está en UTF-8. Por algún motivo, la función "Copia de seguridad en MS" de Sony Ericsson guarda el archivo VCF en UTF-8. – GPX

+0

@GPX: vea mi respuesta actualizada, creo que debería resolver su problema. – Kredns