2011年4月9日 星期六

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

2011年4月9日 星期六
我一直很單純的想,在中文 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 的編碼 (藍色的指令)。

4 則留言:

  1. chcp 65001
    dir /b mp3 > mp3_list.txt

    回覆刪除
    回覆
    1. 高手:
      謝謝您, 多學會了一招 ^_^

      刪除
  2. 我原本內接硬碟也正常,不知道弄到甚麼,執行CMD /U /C DIR /B 會有亂碼的問題,但這個BAT拿到外接式硬碟去執行卻沒編碼問題。難道是我的磁碟區編碼跑掉了嗎?

    回覆刪除
  3. 真的是好神奇,
    CMD /U /C DIR /B 原本OK,但突然有亂碼問題
    -----------------------------------------
    CHCP 65001
    DIR /B
    這樣執行卻沒問題,難道這是CMD /U 失靈了嗎?

    回覆刪除

 
雄::gsyan © 2009. Design by Pocket