【问题标题】:What is the default encoding for source files in Visual Studio 2017?Visual Studio 2017 中源文件的默认编码是什么?
【发布时间】:2018-09-12 09:43:56
【问题描述】:

似乎 Visual Studio 2017 总是将新文件保存为 UTF8-BOM。 早期版本的 Visual Studio 似乎也不是这种情况,但我找不到任何文档。

还有一个选项“高级保存选项\编码”允许更改新保存文件的编码,而 VS2017 中缺少该选项。

问题:

  • VS2017 中是否所有文件类型都使用 UTF8-BOM 编码保存?
  • 是否可以在VS2017中为新文件配置编码?
  • VS2017 会改变没有 UTF8-BOM 的“旧”文件的编码吗?
  • 是否有关于此主题的任何文档?

【问题讨论】:

标签: c# visual-studio-2017


【解决方案1】:

还有一个选项“高级保存选项\编码” 确实允许更改丢失的新保存文件的编码 在 VS2017 中。

This feature 已经存在!您可以使用特定字符编码保存文件以支持双向语言。您还可以在打开文件时指定编码,以便 Visual Studio 正确显示文件。

使用编码保存文件

  1. 文件菜单中,选择将文件另存为,然后单击 保存按钮旁边的下拉按钮。高级保存选项 显示对话框。
  2. 在编码下,选择用于文件的编码。
  3. (可选)在行尾下,选择行尾的格式 字符。

VS2017中所有文件类型都是用UTF8-BOM编码保存的吗

在我的例子中,VS 使用 CodePage 1252 编码存储所有文件。

是否可以在VS2017中为新文件配置编码

然而,我的 Visual Studio 版本是 15.6.1,有些人在 2017 的早期版本中遇到了和你一样的问题,但是 they said "我们已经解决了这个问题,它在 Visual Studio 2017 15.3 中可用"

如果不起作用,对于 C++ 项目,请查看 /utf-8 (Set Source and Executable character sets to UTF-8)

VS2017 会改变“旧”文件的编码吗? UTF8-BOM

默认情况下,Visual Studio 会检测字节顺序标记以确定源文件是否采用编码的 Unicode 格式,例如 UTF-16 或 UTF-8。如果未找到字节顺序标记,则假定源文件使用当前用户代码页进行编码,除非您使用 /utf-8 或 /source-charset 选项指定了代码页。 Some people encountered a problem 来自 .editorconfig 文件,如下:

root = true

[*]
indent_style = tab
indent_size = 4
tab_width = 4
trim_trailing_whitespace = true
insert_final_newline = true
charset = utf-8 

最后的 charset 行很可能会这样做...但我不是要'utf-8-with-bom'!

【讨论】:

  • 我的问题是,在 .editorconfig 设置为 charset = utf-8 的 VS2019 中,当我使用 bom 保存之前为 utf-8 的已编辑和保存文件时,BOM 被剥离。解决方法是将 .editorconfig 设置更改为 charset = utf-8-bom 您在回答中有点回避这一点,但我认为值得明确指出,因为我搜索了几个小时但找不到明确记录的 网络上的任何地方
  • @RonC 是的,editorconfig 文件覆盖了缩进等一些配置。
  • 我认为它基本上会覆盖其中列出的所有内容。这很好,但是 charset = utf-8 和 charset = utf-8-bom 之间的区别可能不会跳出来,除非他们意识到要寻找它。
【解决方案2】:

您可以使用 EditorConfigcharset 属性来定义 VS 2017 中源文件的编码。

【讨论】:

  • 看来我可以为 charset 属性设置 UTF8,但是在这种情况下文件是否也会设置字节顺序标记(BOM)?
  • charset 属性的 utf-8 值表示没有 BOM,utf-8-bom 值添加 BOM。
  • 但 utf-8-bom 未列为 charset 的可能值
  • 主要是因为一些旧程序在“BOM”上阻塞,@Manuel。 UTF-8 不需要它,因为单个代码点中的字节顺序仅在代码点由多个字节组成时才需要考虑;由于 UTF-8 只有 8 位代码点,并且代码点本身必须始终按正确顺序排列,因此 UTF-8 始终按正确顺序排列。虽然它可以用作通用的 UTF-8 签名(我个人更喜欢这样),但在一些相对知名的情况下,程序会阻塞 BOM 并错误地解析 UTF-8 文本文件。因此,他们通常不推荐它。
  • 谢谢你,@NicholasPetersen。 (而且,大家请忽略轻微的错字,“8-bite”应该是“8-bit”。;P)
【解决方案3】:

显然,由于不常见的使用,“高级保存选项\编码”选项已从“文件”菜单中删除。这是 Visual Studio 团队成员 (see this) 给出的原因。

该选项仍然存在,但您必须多点击几下。

  1. 在菜单条中,转到文件 -> 另存为
  2. 当保存文件对话框出现时,保存按钮有一个向下箭头。点击它。
  3. 选择使用编码保存...

一旦您将文件保存为某种格式(我相信您正在寻找的是Unicode (UTF-8 without signature) - Codepage 65001),Visual Studio 理论上不应该随心所欲地更改它。

但问题是,一旦删除 BOM,没有读者能真正 100% 确定地知道给定的文本文件实际上是 UTF-8。这只是观察行为,但如果你去 Save as With Encoding... 并选择
Unicode (UTF-8 without signature) - Codepage 65001 (这是没有 BOM 的 UTF8),BOM 将被删除.....但是,当你关闭文件并重新打开它,然后再次转到高级保存选项,您会注意到 Visual Studio 假定文本格式为CodePage 1252。该文件当然是完全有效的,因为它将每个可能的字节值映射到某个字符,但在某些边缘情况下可能会给您带来奇怪的结果。

它不会做的一件事是重新添加 BOM(至少我从未见过)。希望这会有所帮助。

【讨论】:

  • 这绝对是至少两个问题的答案。您是因为经验而知道这一点,还是有一些文档?
  • 我还没有找到任何关于 VS 的特定文档。全部来自经验。事实上,我们最近遇到了一个问题,对于 Win32 应用程序,Codepage 1252 源文件决定变为 UTF-8 无签名(尽管我们无法确定它是 VS 还是程序员)。代码本身没有问题,但部署后,UI 中的一些字符串变成了一堆奇怪的字符。我们花了一些时间将其追溯到编码的变化。我想这正是 VS 现在默认使用带有签名的 UTF-8 的原因。
  • 文本阅读器可以在文本文件中查找各种标记以“尝试”并确定编码,但现在确实有办法确定。这实际上取决于文件内容。我想说对于 99% 的源文件,Codepage 1252 和 UTF-8 No BOM 之间没有区别。但显然你不能指望它,因为任何文本文件在技术上都是有效的 Codepage 1252 文件。如果您的源文件确实包含专门来自 UTF-8 集的字符,那么文本阅读器将如何解释它是一个掷硬币的问题……当然,如果没有 BOM。
【解决方案4】:

检查 Fix File Encoding 扩展,以防止 Visual Studio 2017/2015/2013/2012 将 BOM 添加到 UTF-8 文件。

通常,当您在 Visual Studio 中编辑 UTF-8 文件时,它会添加 字节顺序标记 (BOM) 序列 0xEF、0xBB、0xBF 到开头 文件。有时它会混淆其他应用程序的进一步处理 文件。您可以手动选择编码(文件 - 高级保存 选项...或文件>另存为...>使用编码保存...),但您需要 每次重新打开文件时都这样做

此外,此扩展程序将回答您的大部分问题。

Fix File Encoding 自动检测 UTF-8 文件何时以 Visual Studio 并将其编码设置为不带签名的 UTF-8。如果你 不要编辑文件,它保持不变。如果编辑文件,它 将在没有 BOM 的情况下保存。

Fix File Encoding 可让您配置要根据哪些文件进行编码 文件路径和文件扩展名。默认情况下,只有 .htm 和 .html 文件受到 Visual Studio 的保护。

【讨论】:

  • 我知道这个插件。但我实际上想做相反的事情。我想确保文件始终编码为 UTF8-BOM,因为我对其他应用程序没有问题,并且添加字节顺序标记似乎更合理。最初转换文件很容易,但我很感兴趣 VS2017 的默认行为是什么
  • 他们提到默认情况下它会添加字节顺序标记 (BOM),这就是为什么 VS 在保存时选择另一个选项 > 使用编码保存
【解决方案5】:

不幸的是,这是对 Nik 答案的评论,因此我使用另一个:

  • VS 保存所有 源代码 文件(.cpp、.cs、.h 等)和 Web 文件 (.htm(l), .css, .xml) UTF-8 和 BOM(在 MS 中带有签名) 行话)。

  • 但是,VS 将 VS 创建的 文本文件 保存在 本地设置,例如西欧的代码页 1252 文化。 VS 足够聪明,可以检测到无法在 默认代码页,并会提示您以 UTF-8 编码。视觉的 Studio 会自动保存为 UTF-8,当然还有 BOM,如果你 选中“当数据无法保存时,将文档另存为 Unicode “工具/选项/环境/文档”对话框中的代码页”。

  • 您可以使用“保存”覆盖每个文件的编码 As",但不能覆盖 VS Options 中的默认编码

  • 但是,您可以使用 EditorConfig 文件覆盖默认设置。 如何: https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options?view=vs-2019

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多