c# - 无法将 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 存在应该很容易)
解决方案
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不会追加到末尾,而是覆盖。
推荐阅读
- jquery - Wordpress 插件 - jquery 导致页面加载两次
- vue.js - 材料设计组件滚动选项卡不滚动
- sql-server - plesk 的 MSSQL server 2014 正在连接到我的 Management Studio 2016
- servlets - Prometheus 指标 servlet 不显示任何指标
- generics - 尝试在 kotlin 中为数据类编写补丁函数
- python - 如何在使用 python 3.6 的回调期间暂停?
- r - dplyr::first() 选择第一个非 NA 值
- javascript - 获取按钮中第一个单元格的值单击第三个单元格
- spring - 检查 ClassPathResource 是文件还是文件夹
- r - r中的非线性模型