C# 将扩展ASCII转换为UTF8

C# 将扩展ASCII转换为UTF8,c#,encoding,extended-ascii,C#,Encoding,Extended Ascii,我被要求解决一个文件中的编码问题。 它应该是UTF8格式,但实际上是扩展ASCII格式 结果是一个包含如下案例的文件: 布拉斯利亚;电子通讯:sica 实际应该是: 巴西利亚电力公司信息交流公司信息交流公司信息交流公司 我用这个密码解决了这个问题: private static string FixEncodingIssues(string str) { string fixedStr = str; foreach (KeyVal

我被要求解决一个文件中的编码问题。 它应该是UTF8格式,但实际上是扩展ASCII格式

结果是一个包含如下案例的文件:

布拉斯利亚;电子通讯:sica

实际应该是:

巴西利亚电力公司信息交流公司信息交流公司信息交流公司

我用这个密码解决了这个问题:

private static string FixEncodingIssues(string str)
        {
            string fixedStr = str;

            foreach (KeyValuePair<string, string> pair in encodingErrosDic)
                fixedStr = fixedStr.Replace(pair.Key,pair.Value);
            
            return fixedStr;
        }

        private static Dictionary<string, string> encodingErrosDic = new Dictionary<string, string>()
        {
            { "Ã" , "Ã" },
            { "Ã\x81"  , "Á" },
            { "À" , "À" },
            { "Â" , "Â" },
            { "Ä" , "Ä" },
            { "Ã…" , "Å" },
            { "Ç" , "Ç" },
            { "È" , "È" },
            { "É" , "É" },
            { "Ê" , "Ê" },
            { "Ë" , "Ë" },
            { "ÃŒ" , "Ì" },
            { "Ã\x8D"  , "Í" },
            { "ÃŽ" , "Î" },
            { "Ã\x8F"  , "Ï" },
            { "Ã\x90"  , "Ð" },
            { "Ñ" , "Ñ" },
            { "Ã’" , "Ò"},
            { "Ó" , "Ó" },
            { "Ô" , "Ô" },
            { "Õ" , "Õ" },
            { "Ö" , "Ö" },
            { "×" , "×" },
            { "Ø" , "Ø" },
            { "Ù" , "Ù" },
            { "Ú" , "Ú" },
            { "Û" , "Û" },
            { "Ãœ" , "Ü" },
            { "Ã\x9D" , "Ý" },
            { "Ã\xA0" , "à" },
            { "á" , "á" },
            { "â" , "â" },
            { "ã" , "ã" },
            { "ä" , "ä" },
            { "Ã¥" , "å" },
            { "æ" , "æ" },
            { "ç" , "ç" },
            { "è" , "è" },
            { "é" , "é" },
            { "ê" , "ê"},
            { "ë" , "ë" },
            { "ì" , "ì" },
            { "î" , "î" },
            { "ï" , "ï" },
            { "Ã\xAD" , "í" },
            { "ð" , "ð" },
            { "ñ" , "ñ" },
            { "ò" , "ò" },
            { "ó" , "ó" },
            { "ô" , "ô" },
            { "õ" , "õ" },
            { "ö" , "ö" },
            { "ø" , "ø" },
            { "ù" , "ù" },
            { "ú" , "ú" },
            { "û" , "û" },
            { "ü" , "ü" },
            { "ý" , "ý" }
        };
私有静态字符串固定编码问题(字符串str)
{
字符串fixedStr=str;
foreach(编码错误中的KeyValuePair对)
fixedStr=fixedStr.Replace(pair.Key,pair.Value);
返回固定str;
}
私有静态字典编码ERROSDIC=新字典()
{
{ "Ã" , "Ã" },
{“Ã\x81”,“Á”},
{ "À" , "À" },
{ "Â" , "Â" },
{ "Ä" , "Ä" },
{ "Ã…" , "Å" },
{ "Ç" , "Ç" },
{ "È" , "È" },
{ "É" , "É" },
{ "Ê" , "Ê" },
{ "Ë" , "Ë" },
{ "ÃŒ" , "Ì" },
{“Ã\x8D”,“Í”},
{ "ÃŽ" , "Î" },
{“Ã\x8F”,“Ï”},
{“Ã\x90”,“Д},
{ "Ñ" , "Ñ" },
{ "Ã’" , "Ò"},
{ "Ó" , "Ó" },
{ "Ô" , "Ô" },
{ "Õ" , "Õ" },
{ "Ö" , "Ö" },
{ "×" , "×" },
{ "Ø" , "Ø" },
{ "Ù" , "Ù" },
{ "Ú" , "Ú" },
{ "Û" , "Û" },
{ "Ãœ" , "Ü" },
{“Ã\x9D”,“Ý”},
{“Ã\xA0”,“a”},
{ "á" , "á" },
{ "â" , "â" },
{ "ã" , "ã" },
{ "ä" , "ä" },
{ "Ã¥" , "å" },
{ "æ" , "æ" },
{ "ç" , "ç" },
{ "è" , "è" },
{ "é" , "é" },
{ "ê" , "ê"},
{ "ë" , "ë" },
{ "ì" , "ì" },
{ "î" , "î" },
{ "ï" , "ï" },
{“Ã\xAD”,“í”},
{ "ð" , "ð" },
{ "ñ" , "ñ" },
{ "ò" , "ò" },
{ "ó" , "ó" },
{ "ô" , "ô" },
{ "õ" , "õ" },
{ "ö" , "ö" },
{ "ø" , "ø" },
{ "ù" , "ù" },
{ "ú" , "ú" },
{ "û" , "û" },
{ "ü" , "ü" },
{ "ý" , "ý" }
};

我想知道是否有更好的方法来解决这个问题。我觉得我的解决方案太粗糙了,它对字典中没有列出的字节不起作用。我想知道是否有一种更干净的解决方案,它不需要列出所有扩展情况并用等效的UTF8值替换它们。

当你说“扩展ascii”时,它实际上是什么编码?“扩展ascii”只是指“使用8位字符代码”,没有说明上面的128个字符代码映射到什么字符。这是一个ANSI代码页吗?事实上,看起来您的输入文件是用UTF-8编码的,但被错误地解释为在Windows-1252中,导致了mojibake
Encoding.UTF8.GetString(Encoding.GetEncoding(1252).GetBytes(“BrasÃlia;Eletrônicos e InformÃtica CÃ、meras e accessórios mÃ:sica”)
给出了预期的结果,表明读取文件的代码做错了,而不是编码器。这通常发生在依赖“默认”代码页进行读取时(许多人认为这是UTF-8,但实际上几乎从来都不是,这取决于系统)。有关此定义错误的名称的信息,请参阅。您看到的可能是ISO 8859-1或Windows代码页1252超集。请参阅并反转这些步骤。您使用的是.Net Core还是.Net Framework?在使用ANSI代码页时,这将产生不同。请注意,我的代码行不打算在数据已损坏后用作解决方案——这不会适用于所有可能的字符!您应该确保识别错误应用编码的位置(例如,未能指定
编码且依赖于可能缺少的字节顺序标记的
文件.ReadAllText
),并在该位置进行修复。