C#如何将已转码的UTF-8字符串转换为UTF-16?
解决UTF-8乱码还原为正确Unicode字符串的问题
你的问题本质是:原UTF-8编码的字节被错误地用单字节编码(比如Windows-1252或ISO-8859-1)解析成了字符串,才出现Não é possÃvel equipar这类乱码。你原代码的逻辑错误在于,直接对乱码字符串取UTF-8字节再转UTF-16,相当于在错误的基础上重复错误操作,自然得不到正确结果。
正确的处理步骤应该是逆向还原:
- 先把乱码字符串转回原UTF-8字节数组(用当初错误解析时的单字节编码)
- 再用UTF-8编码解析这些字节,得到正确的Unicode字符串
修正后的C#代码如下:
static void Main(string[] args) { test3(); Console.ReadKey(); } static void test3() { string garbledStr = "Não é possÃvel equipar"; string correctedStr = FixGarbledUtf8(garbledStr); Console.WriteLine(garbledStr); Console.WriteLine(correctedStr); // 输出:Não é possível equipar } static string FixGarbledUtf8(string garbledString) { // 用Windows-1252编码把乱码字符串转回原UTF-8字节(这是此类乱码最常见的根源编码) byte[] originalUtf8Bytes = Encoding.GetEncoding(1252).GetBytes(garbledString); // 用UTF-8解析字节得到正确的Unicode字符串 return Encoding.UTF8.GetString(originalUtf8Bytes); }
如果Windows-1252编码无法还原正确结果,可以尝试替换为ISO-8859-1编码(对应编码ID 28591),将代码中Encoding.GetEncoding(1252)改为Encoding.GetEncoding(28591)即可。
内容的提问来源于stack exchange,提问作者Falakienos
相关产品推荐
相关产品推荐

