C# - 检测文件中的编码,使用找到的编码将更改写入文件

标签 c# .net encoding .net-2.0

我编写了一个小程序来遍历大量文件并在找到特定字符串匹配的地方应用一些更改,我遇到的问题是不同的文件具有不同的编码。所以我想做的是检查编码,然后以原始编码覆盖文件。

在 C# .net 2.0 中最漂亮的方法是什么?

到目前为止,我的代码看起来非常简单;

String f1 = File.ReadAllText(fileList[i]).ToLower();

if (f1.Contains(oPath))
{
    f1 = f1.Replace(oPath, nPath);
    File.WriteAllText(fileList[i], f1, Encoding.Unicode);
}

我看了一下Auto encoding detect in C#这让我意识到如何检测编码,但我不确定如何使用该信息以相同的编码写入。

非常感谢此处的任何帮助。

最佳答案

不幸的是,编码是那些并不总是有明确答案的主题之一。在许多情况下,它更接近于猜测编码而不是检测编码。 Raymond Chen 就此主题发表了一篇精彩的博文,值得一读

文章的主旨是

  • 如果 BOM(字节顺序标记)存在,那么你就成功了
  • 否则就是猜测和启发式

但是我仍然认为最好的方法是您链接的问题中提到的 Darin。让 StreamReader 为您猜测与重新发明轮子。它只需要对您的 sample 进行非常轻微的修改。

String f1;
Encoding encoding;
using (var reader = new StreamReader(fileList[i])) {
  f1 = reader.ReadToEnd().ToLower();
  encoding = reader.CurrentEncoding;
}

if (f1.Contains(oPath))
{
  f1 = f1.Replace(oPath, nPath);
  File.WriteAllText(fileList[i], f1, encoding);
}

关于C# - 检测文件中的编码,使用找到的编码将更改写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4385707/

相关文章:

c# - 预发行包之间的Nuget依赖关系

c# - 可以在存储库中使用 spring.net 更新部分缓存吗?

c# - 不用 LINQ 过滤数据表?

c# - 从网络摄像头获取输入

c++ - SNMP:无法创建/设置变量,编码错误

php - mb_detect_encoding 不能在 Windows-1250 (CP1250) 上正常工作

spring - 在 freemarker 模板中使用 <#ftl> 指令

c# - : caching through HttpContext. Current.Cache 或静态缓存哪个更好?

.net - Krypton Controls 在 Windows 7 机器上表现得很奇怪

c# - 在 Entity Framework 中的组内排序