停止 VS Code 自动猜测编码

停止 VS Code 自动猜测编码

我使用 VS Code 制作一个德语网站。我在文件中使用了德语特殊字符style.css。重新启动 VS Code 并将文件编码从 UTF-8 更改为 Windows-1252 后,我得到了下图所示的内容。
我的“自动猜测编码”未选中,默认编码为 UTF-8。
我该如何停止自动更改编码?我的 VS Code 版本为 1.32.3,我使用的是 Windows 10。

屏幕截图显示字符和编码

答案1

我怎样才能停止自动更改编码?

- 根据你自己的评论, 这自动猜测编码已经离开VS Code
将文件编码为Windows-1252代码页 1252或者CP1252)
需要其他解释。

假设你有一个 VS Code 设置,专门将你的 CSS 文件解码
Windows-1252,我能够非常准确地重现你的情况 。1

1. 重现整个场景

我用的是简化版的style.css,仅包含一行:

/* Ü */

让 VS Code 使用编码打开文件Windows-1252 (使用自动猜测编码离开),
我假设 VS Codesettings.json包含以下代码/行: 2

"[css]": {"files.encoding": "windows1252"},

这样的设置将使 VS Code 将所有.css文件编码为 Windows-12523

如果您下载style.css,然后右键单击它并 使用代码打开,期望看到:

使用编码 Windows-1252 时,Ü 显示为 Ãœ。

^点击放大

你看到的原因 Windows-1252字符——Ãœ而不是单身的 UTF-8 Ü角色,是Windows-1252 读取每个字节作为单个字符 – 非 ASCII 字符 Ãœ
UTF-8另一方面使用两个字节读取单个非 ASCII 字符,如Ü. 4

1. a. 如何Ü正确显示

为了使德文字母Ü正确显示,您需要点击:
使用编码重新打开 >UTF-8根据内容猜测

“使用编码重新打开”会改变文件的解码方式。

选择使用编码重新打开 没有改变文件本身。
它改变了文件的显示在 VS Code 中如何 解码

1. b. 你应该不是

如果您单击以下内容,则会出现问题:
使用编码保存>UTF-8根据内容猜测

使用编码保存 > **UTF-8 会更改文件本身。

更改文件 – 全部-ASCII 字符获取 已转换更改为其对应的 UTF-8 字符。如果您保存文件,则会保存这些更改。

当你现在关闭并重新打开时style.css,它将再次编码作为Windows-1252
(为什么?——因为这正是 VS Code 所"[css]": {"files.encoding": "windows1252"},告诉settings.json 的!)

以下是您将看到的内容。

使用编码保存 > **UTF-8 会更改文件本身。

请注意,Ãœ这些字符与问题屏幕截图中显示的字符相同。

你现在看到的原因字符而不是与之前相同。
单身的 UTF-8字符Ã(2字节)显示为 字符Ã(仍然是 2 个字节)解码时 Windows-1252.
而单曲UTF-8字符œ显示为两个 Windows-1252人物Å“

至此,我对您的场景的复现就完成了。

2. 如何修复损坏的文件

鉴于您想要显示Ü而不是损坏的Ãœ,您需要:\

  1. 将文件转换回来,
  2. 编码为UTF-8
  3. 关闭并重新打开文件。

1. 将文件转换回来

以下是如何将损坏的文件style.css恢复到原始状态。
从上一个屏幕截图开始,在状态栏中单击窗户 1252
然后使用编码重新打开,最后UTF-8

Windows 1252 > 使用编码重新打开 > UTF-8。

期望看到Ãœ。文件仍然损坏,所以现在转变Windows-1252 通过点击 :
UTF-8 >节省编码 > Windows 1252

UTF-8 > 使用编码保存 > Windows 1252。

现在文件已经转换回原始状态。
剩下的就是解码正确(与UTF-8)。

2. 使用 UTF-8 编码

在 中settings.json,删除 "[css]": {"files.encoding": "windows1252"},

3. 关闭并重新打开文件

关闭并重新打开style.css。检查是否看到UTF-8在状态栏中。期望看到:

损坏的文件已被恢复。

耶!任务完成了。

3. Notepad++ 中的编码与转换

为了更好地理解解码/编码转换一个文件,看看在另一个多功能文本编辑器中如何完成这一操作可能会有所帮助:记事本++
这个有用的答案用一张有启发性的图片来解释这种差异:

Notepad++ 中的编码和转换之间的区别。

编码在 Notepad++ 中对应重新开放使用编码 在 VS Code 中,而
转换在 Notepad++ 中对应 节省使用编码在 VS Code 中。

4. ASCII、ANSI 和 UTF-8

一些事实可能有助于理解ASCII美国国家标准, 和UTF-8是。

  • ASCII 字符仅使用一个字节。
    或者,如果您愿意,它使用字节的八位中的七位 - 最高有效位始终为零。
    这对应于十进制数中的 0-127、十六进制数中的 0x00-0x7F
    和位中的 0000 0000 - 0111 1111。

  • ANSI/Windows-1252 和 UTF-8 都将 ASCII 字符编码为 ASCII 字符本身。
    例如,字符(字母)k是纯 ASCII 字符。这是一个字节(八位)十进制数为 107,十六进制数为 0x6B,位为 0110 1011。
    因此,说 ASCII 字符k不是ANSI 字符,也不是不是UTF-8 字符。 – 两者都是!
    如果文本文件包含仅有的ASCII 字符,则 ANSI 和 UTF-8 编码一致。
    不能区分一个文件与另一个文件。这样的文件两个都美国国家标准UTF-8 编码 。5

windows-1252(CP-1252)编码表。

^点击放大

上半部分Windows-1252上表对应数字 0-127,下半部分对应数字 128-255。后者是非 ASCII美国国家标准的字符Windows-1252


下面的图片取自 UTF-8 和 ASCII 字符表
并显示所有这些Windows-1252再次输入字符,编号为 128-255。

windows-1252(CP-1252)非 ASCII 字符。


如果你想知道有多少字节(和什么字节)一个 UTF-8 字符使用,尝试这个在线工具

参考


1 我认为我提出的情景合理地描述了什么可能 发生了。
当然,我无法确切知道是什么导致了你的情况。

2 要打开settings.json,请按Ctrl+ ,(逗号),然后单击打开设置右上角的图标:

打开设置 (JSON)

在 macOS 上,使用而不是Ctrl

3 用于表示 Windows 代码页的术语“ANSI”是一个历史参考 […].
微软仍然使用西欧的 ANSI交替使用 Windows-1252,例如在他们的notepad.exe文本编辑器中,通常位于C:\WINDOWS\System32。这也是我遵循的惯例。另请参阅这个答案

4 更准确地说,每个非 ASCII UTF-8 字符使用至少 两个(最多四个)字节

5 假设你有一个文本文件,其中包含仅有的纯 ASCII 字符。如果你在某个文本编辑器中打开该文件,状态栏显示 ANSI,这并不意味着该文件是不是UTF-8 编码。这只是意味着此文本编辑器使用 ANSI 作为其默认 编码。如果默认编码为 UTF-8,编辑器将在状态栏中显示 UTF-8对于同一个文件

相关内容