【问题标题】:Read multiple files with different encoding, preserving all characters读取具有不同编码的多个文件,保留所有字符
【发布时间】:2021-10-22 08:44:18
【问题描述】:

我正在尝试读取一个文本文件并写入一个新的文本文件。输入文件可以是 ANSI 或 UTF-8。我不在乎输出编码是什么,但我想在写入时保留所有字符。这个怎么做?我是否需要获取输入文件的编码(似乎需要做很多工作)。
以下代码读取 ANSI 文件并将输出写入为 UTF-8,但有一些乱码“�”。

我正在寻找一种方法来读取文件,无论这两种编码中的哪一种都可以正确写入,而无需事先知道输入文件的编码。

File.WriteAllText(outputfile,File.ReadAllText(inputfilepath + @"\ST60_0.csv"));

请注意,此批处理命令读取一个 UTF-8 和 ANSI 文件并将输出写入为 ANSI 并保留所有字符,因此我希望在 C# 中执行此操作:

type ST60_0.csv inputUTF.csv > outputBASH.txt

【问题讨论】:

  • Do I need to get the input file's encoding - 不,你应该知道它。 The following code reads ANSI file - 也就是 not what happens,它“尝试根据字节顺序标记的存在自动检测文件的编码”。
  • File.Copy 怎么样?还是我错过了什么?
  • @Steeeve 我需要将多个输入文件附加到输出文件中。
  • 那也是not well defined。如果您的意思是它们是 ASCII(前 128 个 ASCII),那么您可以将它们全部视为 as UTF-8。从你得到问号的事实来看,它们不是,所以你应该在阅读它们时知道并正确指定编码。
  • 问:有问题的文件是否有 BOM?问:你能告诉我们你的一个“?”的十六进制值?人物?问:您认为原始“ASCII”中的字符应该是什么?文本文件?请使用此信息更新您的帖子。

标签: c# windows encoding file-io


【解决方案1】:

问:以下代码读取 ANSI 文件并将输出写入为 UTF-8,但 有一些乱七八糟的字符“�”。

答:查看其中一些“gibberish”字符的十六进制值肯定会很有用。也许您可以在 Notepad++ 中安装一个 Hex 插件并告诉我们?

问:让我大吃一惊,在 C# 中执行该命令太难了 提示可以很容易

A:通常,它容易。这个特定文件中似乎写入了“一些特别的东西”。

C# 与其他“更简单”的方法之间的区别在于,C#(与 C 字符 I/O 或 .bat 文件不同)为您提供灵活性来处理不会发生的文本是“标准 ASCII”。

无论如何:

如果“?”您发布的 (hex 0xefbfbd) 是您实际文本的有效示例,这可能解释了发生了什么:

https://stackoverflow.com/a/25510366/421195

... %EF%BF%BD 是 url 编码的十六进制表示形式 UTF-8 替换字符的 3 个字节(EF BF BD)。

另见:

https://en.wikipedia.org/wiki/Specials_(Unicode_block)

替换字符 �(通常显示为黑色菱形,带有 白色问号)是 Unicode 标准中的符号 在特价表中点 U+FFFD。它用于指示问题 当系统无法将数据流呈现为正确的 符号。[4]通常在数据无效且没有 匹配任意字符

您可能也对此感兴趣:

https://docs.microsoft.com/en-us/dotnet/standard/base-types/character-encoding

Best-Fit Fallback 当一个字符在目标编码中没有完全匹配时,编码器可以尝试将其映射到一个相似的 字符。


更新:

违规字符是“»”,十六进制 0xc2bb。这是“直角报价”,Guillemet。角引号是在某些语言中使用的带有罗马字母的引号,例如法语。

一种可能的解决方案是指定“iso-8859-1”,而不是默认编码“UTF-8”:

File.WriteAllText(outputfile,File.ReadAllText(inputfilepath + @"\ST60_0.csv",  System.Text.Encoding.GetEncoding("iso-8859-1")));

【讨论】:

  • 看起来字符是 EF BF BD
  • OK:那么源文件(ST60_0.csv)中对应的字符是什么?如果是 0xEFBFBD,则意味着“输入损坏”。什么 - 如果有的话 - 你可以做些什么来纠正 .csv 的编写方式?否则,如果您对源文件无能为力,则可以考虑我上面引用的“最佳后备”。
  • @bakalolo 问:您从源文件 (ST60_0.csv) 中发现了什么?你都有些什么想法呢?你有什么计划?
  • 我放弃了刚刚从c#调用的bash命令
  • @bakalolo:我非常失望,我们仍然不知道为什么 EF BF BD 正在发生。问:是源文件的问题吗?问:您对 .csv 的编写方式有任何控制权吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 2012-07-27
  • 1970-01-01
相关资源
最近更新 更多