2

我正在尝试将 C# 字符串数据写入没有字节顺序标记 (BOM) 的 UTF-8 文件,但正在创建一个 ANSI 文件。

using (StreamWriter objStreamWriter = new StreamWriter(SomePath, false, new UTF8Encoding(false)))
{
objStreamWriter.Write("Hello world - Encoding no BOM but actually returns ANSI");
objStreamWriter.Close();
}

根据UTF8Encoding类构造函数的文档,将encoderShouldEmitUTF8Identifier参数设置为 false 应该会禁止字节顺序标记。

我在我的英国 (en-gb) 计算机上使用 .NET Framework 4.5。下面是 ScreenWriter 对象的屏幕截图,显示了UTF8Encoding到位。

StreamWriter 对象

那么为什么我从这个操作中得到一个 ANSI 文件(用 Notepad++ 检查)?

4

3 回答 3

1

您写入文件的示例字符串仅包含 ASCII 范围内的字符。ASCII 范围由 ASCII、UTF-8 和大多数(全部?)ANSI 代码页共享。因此,鉴于没有 BOM,Notepad++ 没有指示是 UTF-8 还是 ANSI,并且显然默认为 ANSI。

于 2012-12-15T20:52:00.660 回答
1

如果没有 BOM 且没有 unicode 字符,您如何期望 Notepad++ 将其识别为 UTF-8?UTF-8、ANSI 和 ASCII 对于您发出的字符都相同吗?

(即使您包含一些 unicode 字符,Notepad++ 也可能难以猜测正确的编码。)

于 2012-12-15T20:53:17.320 回答
0

在“Hello world - Encoding no BOM but 实际上返回 ANSI”中,UTF8 和 ANSI 中没有任何字符的编码方式不同。由于没有 BOM,Notepad++ 显示文件以 ANSI 编码,因为没有“特殊字符”。尝试在文件中添加“é, à, ê”字符,Notepad++ 会将其显示为以 UTF8 编码而没有 BOM。

于 2012-12-15T20:52:29.600 回答