停止 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 程式碼中。

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
    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對於同一個文件

相關內容