Преобразование 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
методы.