首页 > 解决方案 > 无法将 UTF-8 文件中的特殊字符转换为 ANSI

问题描述

我有一个需要阅读的文件,并且必须在最后添加一个文本。程序因字符 "í" 而失败。在以记事本++(UTF-8)编码打开文件时,我可以看到在此处输入图像描述

在我的 C# 代码中,我尝试将其转换为默认编码,但应用程序将其更改为“?” 而不是“í”。

示例代码:

string processFilePath = @"D:\Test\File1.txt";
string outfile = @"D:\Test\File2.txt";

using (StreamReader reader = new StreamReader(processFilePath))
{
    using (StreamWriter writer = new StreamWriter(outfile, false, Encoding.Default))
    {
        writer.WriteLine(reader.ReadToEnd());
    }
}

                

我查看了关于 SO 的类似问题(上面的代码片段是此处的修改版本): UTF-8 to ANSI Conversion using C#

我尝试了“System.Text.Encoding”中可用的不同类型的编码 - ASCII / UTF * / Default,但我能得到的最好的是“?” 而不是“í”。

我也经历过: http: //kunststube.net/encoding/,我确实学到了很多东西,但仍然无法解决问题。

我得到了什么:在此处输入图像描述

我需要的:在此处输入图像描述

在微软网站上在此处输入图像描述

我还缺少什么(如果 System.Text.Encoding.ANSI 存在应该很容易)

标签: c#utf-8ansi

解决方案


MSDN

StreamReader 默认为 UTF-8 编码,除非另有说明,而不是默认为当前系统的 ANSI 代码页。

即,当打开StreamReader(processFilePath)它时,它需要 UTF-8 中的数据,这似乎不是这种情况,即,如果源文本是 ANSI,或者很可能是西班牙语的 Windows-1252,请使用

using (StreamReader reader = new StreamReader(processFilePath, Encoding.GetEncoding(1252)))
{
    using (StreamWriter writer = new StreamWriter(outfile, false, Encoding.UTF8))
    {
        writer.WriteLine(reader.ReadToEnd());
    }
} 

注意指定 1252 和 UTF8。

PS还要注意 StreamWriter 中的false不会追加到末尾,而是覆盖


推荐阅读