将ANSI(Windows 1252)转换为C#中的UTF8

问题描述 投票:4回答:7

在堆栈溢出之前,我已经绕过asked this before了,希望这次能正确解决。如何在保留特殊字符的同时将ANSI(代码页1252)转换为UTF-8? (我知道UTF-8支持比ANSI大的字符集,但是我可以保留ANSI支持的所有UTF-8字符并用?或其他字符替换其余字符,这是可以的)

为什么要转换ANSI→UTF-8

我基本上是在编写一个程序,将vCard文件(VCF)拆分为单个文件,每个文件包含一个联系人。我注意到诺基亚和索尼爱立信手机将备份的VCF文件保存为UTF-8(无BOM),但Android则将其保存为ANSI(1252)。而且上帝知道其他手机以什么格式保存它们!

所以我的问题是

  1. vCard文件的字符编码是否没有行业标准?
  2. 哪个更容易解决我的问题?将ANSI转换为UTF8(和/或反之)或尝试检测输入文件具有哪种编码并通知用户?

tl; dr需要知道如何在保留所有特殊字符的同时将字符编码从(ANSI / UTF8)转换为(UTF8 / ANSI)。

c# .net string character-encoding special-characters
7个回答
8
投票

VCF按照第3.4章中的the spec的要求,以utf-8编码。您需要认真对待这一点,如果格式不是一成不变的,那么格式将完全无用。如果您看到某些Android应用程序带有重音符号,则可以假设这是该应用程序中的错误,从而可以正常工作。或更可能是它从其他地方获取了错误的信息。您尝试更正编码将导致more问题,因为您的卡版本将与原始版本不匹配。

您使用Encoding.GetEncoding(1252).GetString()从1252转换为utf-8,并传入byte []。永远不要尝试编写读取字符串并将其打包为byte []的代码,以便可以使用转换方法,这只会使编码问题变得更糟。换句话说,您需要使用FileStream而不是StreamReader读取文件。但同样,避免解决其他人的问题。


13
投票
您不应该从一种编码转换为另一种编码。您必须使用创建时使用的编码来读取每个文件,否则将丢失信息。

8
投票
这是我在C#中使用的(我一直在使用它将其从Windows-1252转换为UTF8)

5
投票
我这样做:

1
投票
我在将大量的古代文本文件处理为格式正确的PDF时发现了这个问题。这些文件都没有BOM,并且最旧的文件包含Codepage 1252代码点,这些代码点会导致对UTF8的错误解码。这仅在某些时间发生,UTF8在大多数时间都起作用。另外,最新的文本数据确实包含UTF8代码点,因此情况不一。

所以,我还列出了

“以检测输入文件具有哪种编码”


0
投票
我使用它来将文件编码转换为UTF-8

-1
投票
    vCard文件的字符编码是否没有行业标准?
© www.soinside.com 2019 - 2024. All rights reserved.