2011年4月9日 星期六

Windows : 在 cmd 下的 dir 輸出 UTF-8 編碼的清單

我一直很單純的想,在中文 Windows 的「指令直譯器」「cmd」 中下 「dir」這種內部指令看到的中文是 big5 編碼,如果是簡體字就是對應的簡體編碼,那只要利用 ConvertZ 這個工具就可以將檔名清單轉為 UTF-8。沒想到大錯特錯,顯示和輸出是不一樣的,有些中文字會變成問號。

cmd 中內部指令預設輸出是以 ANSI 編碼,正體中文的部份看似 big5 ,所以利用 ConvertZ 可以用類似:
ConverZ /i:big5 /o:utf8 ..........
這樣的語法將 dir 輸出的清單中文轉為 UTF-8 編碼,但是非 big5 的部份就無法正常顯示,通通變成問號了。
查了一下,原來 「cmd」可以利用「/u」的參數讓內部指令的輸出改用 Unicode 的格式,如果再搭配參數「/c」和「&&」符號,就可以讓我要的檔案清單通通轉成 UTF-8。
看一下 Windows cmd 的部份說明:
C:\>cmd /?
啟動 Windows XP 命令直譯器新例項

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] string]

/C      執行字串中所描述的命令然後結束命令視窗
/K      執行 字串中所描述的命令然後保留命令視窗
/S      修改字串在 /C 或 /K (參看下方)
/Q      關閉 echo
/D      從登錄中停用 AutoRun 命令(參看下方)
/A      將內部命令輸出結果以 ANSI 格式導向 pipe 或檔案
/U      將內部命令輸出結果以 Unicode 格式導向 pipe 或檔案
/T:fg   設定幕前/幕後色彩 (參看 COLOR /?)
/E:ON   啟用命令延伸 (參看下方)
/E:OFF  停用命令延伸 (參看下方)
/F:ON   啟用檔案及目錄名稱完整字元(參看下方)
/F:OFF  停用檔案及目錄名稱完整字元(參看下方)
/V:ON   啟用延遲環境變數延伸,用 c 作為分隔字元。例如,
        /V:ON 可以讓 !var! 在執行時展開變數 var。文法
        var 則會在輸入時展開變數,這在 FOR 迴圈之中是
        完全不同的事。
/V:OFF  停用延遲環境變數展開

例如:
cmd /u /c dir /b mp3 > mp3_list.txt && ConvertZ.exe /i:ULE /o:utf8 mp3_list.txt mp3_list.txt

上面這一行指令做了以下的事情:
  • cmd /u /c :告訴 cmd  以 Unicode 格式輸出,並執行後面的兩道指令(粗體字的部份)。
  • 以 dir 將 mp3 目錄中的檔名輸出到 mp3_list.txt 中儲存 (紅色的指令)。
  • 以 ConvertZ 將 mp3_list.txt 中的字,由 Unicode (ULE) 轉成 UTF-8 的編碼 (藍色的指令)。

2 則留言:

 
© 2009. Design by Pocket