在堆栈溢出之前,我已经绕过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)。而且上帝知道其他手机以什么格式保存它们!
所以我的问题是
tl; dr需要知道如何在保留所有特殊字符的同时将字符编码从(ANSI / UTF8)转换为(UTF8 / ANSI)。
VCF按照第3.4章中的the spec的要求,以utf-8编码。您需要认真对待这一点,如果格式不是一成不变的,那么格式将完全无用。如果您看到某些Android应用程序带有重音符号,则可以假设这是该应用程序中的错误,从而可以正常工作。或更可能是它从其他地方获取了错误的信息。您尝试更正编码将导致more问题,因为您的卡版本将与原始版本不匹配。
您使用Encoding.GetEncoding(1252).GetString()从1252转换为utf-8,并传入byte []。永远不要尝试编写读取字符串并将其打包为byte []的代码,以便可以使用转换方法,这只会使编码问题变得更糟。换句话说,您需要使用FileStream而不是StreamReader读取文件。但同样,避免解决其他人的问题。
所以,我还列出了
“以检测输入文件具有哪种编码”