6

我正在尝试用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);
}
4

1 回答 1

12

您假设 Windows-1252 支持您上面列出的特殊字符是正确的(完整列表参见Wikipedia entry)。

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用来将 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);
    }
}

此外,您可能希望usings 添加到您的ReadFileandWriteFile方法中。

于 2010-12-04T05:10:29.977 回答