我有一些帶有俄語(西里爾字母)名稱的文件。
當我在 Windows 資源管理器中開啟它們時,名稱顯示正確。
當我在命令 shell (cmd) 中列出它們時,它們顯示為“??????”特點。
有沒有辦法知道檔案名稱中使用了什麼編碼?
代碼頁之一? (我使用指令嘗試了常見的西里爾代碼頁 866 和 1251,chcp
但沒有成功)。 Unicode(我試過 65001 沒成功)?還有別的事嗎?
我並不特別關心答案的方法(以下所有內容都是可以接受的:免費軟體程式、Perl 腳本、Powershell 腳本、讓我上傳文件的網頁)。
系統:Windows XP SP3。
答案1
檔案名稱編碼由檔案系統定義。 NTFS 使用 UTF-16。不過沒關係。
當您dir
在命令列中時,它不會只是盲目地複製位元組。它首先必須呼叫適當的作業系統函數來列出目錄,然後將接收到的檔案詳細資料列印到控制台。
當cmd
呼叫系統函數來檢索目錄列表時,它已經期望以首選編碼返回(這不一定是您選擇的編碼 - 稍後會詳細介紹)。它不關心 FS 內部使用什麼編碼,因為作業系統提供了額外的抽象層來簡化事情。 FS 可以使用您可以想像的任何編碼,但只要作業系統支援它,cmd
就會以其首選編碼而不是 FS 的編碼接收檔案名稱。
我提到的「首選編碼」是應用程式碼頁面的 ANSI 或 Unicode。在 Windows 2000 之前,ANSI 被用作預設編碼。
對於 Unicode 程序,代碼頁被完全忽略並且chcp
沒有任何作用。它僅用於依賴正確設定的代碼頁的舊版 ANSI 程式。對於 Unicode 來說,這不再重要,因為它定義良好,並且支援任何合理程式可以輸出的所有內容。
cmd
確實支援 Unicode,因此它將接收已經採用 Unicode 的檔案名稱。
正如您已經發現的,罪魁禍首是預設字體。這個問題在chcp 上的 Technet 頁面:
只有隨 Windows XP 安裝的原始裝置製造商 (OEM) 代碼頁才能正確顯示在使用光柵字型的命令提示字元視窗中。其他代碼頁在全螢幕模式或使用 TrueType 字型的命令提示字元視窗中正確顯示。