将 Unicode 转换为用于 vCard 的 Windows-1252

Converting Unicode to Windows-1252 for vCards(将 Unicode 转换为用于 vCard 的 Windows-1252)
本文介绍了将 Unicode 转换为用于 vCard 的 Windows-1252的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试用 C# 编写一个程序,该程序会将包含多个联系人的 vCard (VCF) 文件拆分为每个联系人的单独文件.我知道大多数手机需要将电子名片保存为 ANSI (1252) 才能读取它们.

I am trying to write a program in C# that will split a vCard (VCF) file with multiple contacts into individual files for each contact. I understand that the vCard needs to be saved as ANSI (1252) for most mobile phones to read them.

但是,如果我使用 StreamReader 打开一个 VCF 文件,然后使用 StreamWriter(设置 1252 作为编码格式)将其写回,所有特殊字符如 åæø 被写成 ?.ANSI (1252) 肯定会支持这些字符.我该如何解决这个问题?

However, if I open a VCF file using StreamReader and then write it back with StreamWriter (setting 1252 as the Encoding format), all special characters like å, æ and ø are getting written as ?. Surely ANSI (1252) would support these characters. How do I fix this?

这是我用来读写文件的一段代码.

Here's the piece of code I use to read and write the file.

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

推荐答案

您正确地假设 Windows-1252 支持上面列出的特殊字符(有关完整列表,请参阅 维基百科条目).

You are correct in assuming that Windows-1252 supports the special characters you listed above (for a full list see the Wikipedia entry).

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

在我使用上面代码的测试应用程序中,它产生了这个结果:

In my test app using the code above it produced this result:

看看我能写出的很酷的字母:å、æ 和 ø!

找不到问号.使用 StreamReader 读取时是否设置了编码?

No question marks to be found. Are you setting the encoding when your reading it in with StreamReader?

您应该能够使用 Encoding.Convert 将 UTF-8 VCF 文件转换为 Windows-1252.不需要 Regex.Replace.这是我的做法:

You should just be able to use Encoding.Convert to convert the UTF-8 VCF file into Windows-1252. No need for Regex.Replace. Here is how I would do it:

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

这是我的扩展方法的外观:

And here is how my extension method looks:

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 到您的 ReadFileWriteFile 方法.


Also you'll probably want to add usings to your ReadFile and WriteFile methods.

这篇关于将 Unicode 转换为用于 vCard 的 Windows-1252的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)