(文本)支持编码的文件

时间:2018-07-12 12:47:44

标签: file encoding utf-8 persistence file-type

我正在处理的项目将xml文件和输入流转换为pdf和文本。在单元测试中,我将生成的文本与具有预期输出的body{ background-image:linear-gradient(to right, transparent 50%, orange 50%), url('https://material.angular.io/assets/img/examples/shiba1.jpg'); }文件进行比较。

我现在面临的问题是这些.txt文件没有以UTF-8编码,并且编写时没有保留此信息(即变音符号)。

我读过几篇关于持久化和编码.txt文件的文章。包括correcting the encodingsaving and opening files in Visual Studio with encoding等。

我想知道是否有.txt支持例如xml或html这样的有关编码的元信息。

我正在寻找的解决方案是:

  • 易于适应同一团队中的任何同事
  • 很持久,不取决于我在编辑器中选择编码
  • 不需要任何其他外来程序
  • 无需修改text file format类就可以读取它,它是C#的输入读取
  • 至少支持UTF-8编码

1 个答案:

答案 0 :(得分:1)

有时将Unicode字节顺序标记(BOM)用于此目的。当传递文本时,要求处理Unicode的系统剥离此元数据。 File.ReadAllText等执行此操作。 BOM应该仅存在于文件和流的开头。

BOM有时会与编码混淆,因为两者都会影响文件格式,并且BOM仅适用于Unicode编码。在带有UTF-8的Visual Studio中,它称为“ Unicode(带签名的UTF-8)-代码页65001”。

一些C#代码演示了这些概念:

var path = Path.GetTempFileName() + ".txt";
File.WriteAllText(path, "Test", new UTF8Encoding(true, true));
Debug.Assert(File.ReadAllBytes(path).Length == 7);
Debug.Assert(File.ReadAllText(path).Length == 4); // slightly mushy encoding detection

但是,使用文本文件时,这并不能使任何人超出要求的协议。基本规则是,必须使用与编写时相同的编码读取文本文件。通常,BOM不是足以满足文本文件完整协议的通信。

测试编辑器几乎普遍采用了以下原则:首先应该猜测文件的字符编码,并且在大多数情况下允许用户稍后对其进行纠正。一些具有项目系统的IDE允许记录文件实际使用的编码。

合理的文本编辑器将保留现有文件的编码和Unicode BOM的存在。

您似乎在追求通用策略。不幸的是,文本文件概念的历史不允许。