【问题标题】:C# WriteAllBytes ignores character encodingC# WriteAllBytes 忽略字符编码
【发布时间】:2018-09-20 08:47:02
【问题描述】:

我正在使用以下代码:

File.WriteAllBytes("c:\\test.xml", Encoding.UTF8.GetBytes("THIS IS A TEST"))

理论上应该写一个UTF8文件,但我只是得到一个ANSI文件。我也试过这个只是为了特别冗长;

File.WriteAllBytes("c:\\test.xml", ASCIIEncoding.Convert(ASCIIEncoding.ASCII, UTF8Encoding.UTF8, Encoding.UTF8.GetBytes("THIS IS A TEST")))

仍然是同样的问题。

我正在通过加载正确读取格式的 TextPad 来测试输出的文件(我使用示例文件进行了测试,因为我知道这些事情有时会有点奇怪)

【问题讨论】:

  • 如果你的字符串只包含 ASCII,那么 ANSI 和 UTF8 是可以互换的。尝试在字符串中添加一些重音字符,然后看看会发生什么。
  • 很不清楚你是什么意思...你能解释一下“UTF8文件”对你意味着什么吗?
  • File.WriteAllBytes 确实 编写将文件标识为包含 utf8 编码文本的 BOM。请考虑使用 StreamWriter。
  • Alexei - 我在 Textpad 中打开输出的文件,它告诉我文件的编码是什么,它显示了 writeallbytes 输出的 ANSI。如果我将该文件保存在 textpad/notepad 中为 utf-8,然后重新加载它,它会显示为 utf-8。所需的输出将是 utf-8 格式的文件。
  • @tonyenkiducx 有问题的建议:如果您需要编写文本 - File.WriteAllText(@"c:\temp.txt", "test", Encoding.UTF8); 更容易,如果您需要编写 XML - 使用 XML 类。 (普通人不太可能通过字符串连接/手动编写正确构造 XML……如果使用常规的 .Net XML 类,其他人会更容易理解代码)

标签: c# encoding utf-8 ascii system.io.file


【解决方案1】:

WriteAllBytes 不是忽略编码 - 而是:你已经做了编码,当你调用 GetBytes 时。 WriteAllBytes 的全部意义在于它写入字节。字节没有编码;而是:编码是将文本(此处为string)转换为字节(此处为byte[])的过程。

对于所有 ASCII 字符,UTF-8 与 ASCII 相同 - 即 0-127。所有"THIS IS A TEST" 都是纯ASCII,所以UTF-8 和ASCII 是相同的。

【讨论】:

  • @AlexeiLevenkov 在我的整个编程生涯中,我想我见过有人实际使用 UTF-8 BOM 大约两次,并且至少其中一个(可能两者都是)是导致错误的错误,因为消耗的代码没有预料到它:) 但是是的,你可以写,并且有 is 这样的事情 - @987654327 @
  • 也许我需要重新提出我的问题。我需要创建一个包含 UTF-8 编码字符串的 MemoryStream,我正在使用 writeallbytes 来测试输出。我假设当编码为字节然后保存到内存流时,字符串会保留它的 UTF8 格式,但似乎没有。我会写另一个问题,因为这似乎是一个很好的问题。
  • 另外,Encoding.UTF8.GetPreamble() 给出了 BOM 序列。但是,(new UTF8Encoding()).GetPreamble() 给出了一个空(长度为零)数组。
  • 这是有道理的@JeppeStigNielsen。 File.WriteAllBytes("c:\\test.xml", Encoding.UTF8.GetPreamble().Concat(Encoding.UTF8.GetBytes("这是一个测试")).ToArray());
  • @tonyenkiducx 我认为这里的一个关键问题是:您期望什么字节?因为我希望 14 个字节恰好与 ASCII 相同。
【解决方案2】:

你试过了吗?

File.WriteAllText(@"c:\test.xml", "THIS IS A TEST", Encoding.GetEncoding(28591));

(28591 是 UTF8 的 ISO)

【讨论】:

  • 如果你什么都不解释,你希望 OP 如何理解他的问题?
  • 不,它提供了一个Latin1Encoding 实例。如果要从代码页编号创建它,则需要 65001。但这不是这里要问的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多