Преобразование Unicode в Windows-1252 для vCards

Я пытаюсь написать программу в C# это разделит файл vCard (VCF) с несколькими контактами на отдельные файлы для каждого контакта. Я понимаю, что vCard нужно сохранить как ANSI (1252) для большинства мобильных телефонов, чтобы прочитать их.

однако, если я открою файл VCF с помощью StreamReader а затем запишите его обратно с StreamWriter (установка 1252 в качестве формата кодировки), все специальные символы, такие как å, æ и ø пишутся как ?. Конечно, ANSI (1252) будет поддерживать эти символы. Как это исправить?

Edit: вот кусок кода, который я использую для чтения и записи файла.

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

1 ответов


вы правы, предполагая, что Windows-1252 поддерживает специальные символы, перечисленные выше (полный список см. в Википедии).

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

в моем тестовом приложении, используя код выше, это дало такой результат:

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

нет вопросительных знаков. Вы устанавливаете кодировку, когда читаете ее с помощью StreamReader?

EDIT: Вы должны просто иметь возможность использовать Encoding.Convert конвертировать файл UTF-8 VCF в Windows-1252. Нет необходимости Regex.Replace. Вот как бы я это сделал:

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

и вот как выглядит мой метод расширения:

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

также вы, вероятно, захотите добавить usingна ReadFile и WriteFile методы.