我正在尝试为遗留系统创建一个平面文件,他们要求以MS DOS的文本编码呈现的数据.txt文件(文本文档 - MS-DOS格式CP_OEM)。我在 C#(.net4.0 框架)中使用 UTF8Encoding 类生成的文件之间有点困惑,我认为它会在默认的 txt 文件(编码:CP_ACP)中生成一个文件。
我认为编码名称CP_ACP,Winodows和ANSI指的是同一件事,Windows默认是ANSI,它将省略任何Unicode字符信息。
如果我在C#库中使用UTF8Encode类来创建文本文件(如下所示),它将采用MS DOS txt文件格式吗?
byte[] title = new UTF8Encoding(true).GetBytes("New Text File");
根据提供的答案,很明显 UTF8 不等同于 MSDOS txt 格式,应该使用 Encoding.GetEncoding(850) 方法来获取编码库。
我阅读了以下帖子以检查我的信息,但还没有结论。 https://blogs.msdn.microsoft.com/oldnewthing/20120220-00?p=8273
https://blog.mh-nexus.de/2015/01/character-encoding-confusion
https://blogs.msdn.microsoft.com/oldnewthing/20090115-00?p=19483
最后的结论是在创建要转换回实际文件的字节数组时使用 Encoding.GetEncoding(850)(注意:我正在使用字节数组,因为我可以利用现有的中间件)。
你可以使用File.ReadXY(String, Encoding)
和File.WriteXY(String, String[], Encoding)
方法,其中XY
分别是AllLines
、Lines
或AllText
分别使用string[]
、IEnumerable<string>
和string
。
MS-DOS 使用不同的代码页。代码页 850"西欧/拉丁语-1"或代码页 437"OEM-US/OEM/PC-8/DOS 拉丁美洲美国"(如@HansPassant建议的那样)可能没问题。如果您不确定需要哪个代码页,请使用旧系统创建包含 ä、ö、ü、é、è、ê、ç、à 或希腊字母等字母的示例文件,看看它们是否有效。如果不使用此类字母或其他特殊字符,则代码页不是很关键。
File.WriteAllText(path, "Hello World", Encoding.GetEncoding(850));
对于 ANSI 和 UTF-8,从 0 到 127(7 位)的字符代码对于所有 MS-DOS 代码页都是相同的。UTF 文件有时会引入 BOM(字节顺序标记)。
MS-DOS 只知道 8 位字符。代码 128 到 255 因不同的国家代码页而异。
请参阅:文件类、编码类和维基百科:代码页。