Преобразование Unicode в Windows-1252 для vCards - PullRequest
6 голосов
/ 04 декабря 2010

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

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

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

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 Ответ

12 голосов
/ 04 декабря 2010

Вы правы, полагая, что 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?

РЕДАКТИРОВАТЬ: Вы просто сможете использовать Encoding.Convert для преобразования файла VCF UTF-8 в Windows1252.Нет необходимости в 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 методам.

...