一個軟體,微軟通常需要經歷四、五代,才會搞對
這是前幾天在一個 podcast 中聽到美國幾個 IT 前輩的觀點。我當下腦中立刻發出「一針見血」的反射動作,這兩天更是遇上一個活生生的例子,始作俑者的現行犯是 Windows Media Player。
一位同事最近買了 Macbook,故需要將一些 MP3 從 XP 遷移到 Mac OS 10.5 上的 iTune,其中包括一些過去用 Media Player 從原始 Audio CD 剝下來的中文和日文歌。當這些 MP3 被彙入 Mac 上的 iTune 時,他發現裡面出現了大量的亂碼,而大部分都集中在中、日文歌曲。於是找我求助。
我們知道,MP3 等多媒體檔案的元資料(如歌名、演唱者、專輯名等),是存放在 ID3 標籤裡面的。可能是因為我不愛用 Media Player(覺得 UI 很不直覺),自己過去對處理這個問題還真的沒經驗。替他診斷了一下後,發現這些 MP3 的 ID3 標籤中的文字,都是以簡體中文 CP936, GB2312 的編碼形式存在,而未採用多語言支援更好的 Unicode (UTF-8)。這就有趣了。在 ID3 文字編碼的處理上,Windows Media Player 的做法,不同於其他 MP3 音樂播放器,如 iTune 或 Linux 上的各播放器。人家都是選擇用 Unicode,但微軟則獨排眾議地選擇用本地的語言,所以在不同語言的 OS 下做,會出來不同的結果 — 簡體中文會是 CP936,繁體中文則 CP937…。微軟早在 NT 和 Office 2000 時代便已支援 Unicode,為何 Media Player 不採用真是匪夷所思。
我知道可以用 perl 等腳本語言寫一個轉碼的 script,因為有現成的 ID3 library 模組,所以開發起來很方便。過去我為了要處理一些沒有 ID3 的老 MP3,把檔案和目錄名中的歌名、演唱者、專輯名等資訊,批次寫入新產生的 ID3 標籤,就曾寫過一個 Perl script。上網 search 了一下,果然已經有人寫好了 — Google Code 上有一個叫 mp3-tag-iconv 的 perl script,這是一個華人網友寫的。此外,發現有一個泰國網友在 Linux 上有同樣的問題,他推薦一個 sourceforge 上某俄國網友寫的 Python 腳本 tag2utf (看來,這個問題至少中、泰、俄文的用戶都遇到了)。興沖沖地開始先拿一個王菲的歌,用 mp3-tag-iconv 來測,沒想到遇到一個 bug。反映給作者後,短短兩個小時內,竟然就上傳了新版。這次沒問題了,感謝!能成功地將 test.mp3 中的標籤文字從 cp936/GB2312 轉為 UTF-8。我是在 Cygwin (一套提供 Unix 指令列工具的環境)底下操作該 perl script。
事實上,如果要用這些 scripts 來做批次轉換,還可能遇到其他的挑戰 — 因為不只是 ID3 元資料,就連檔案名和目錄名,都是用歌名、演唱者、專輯名來命名的,而 Unix 指令列環境最怕遇到非 ASCII 的檔案、目錄名,而好死不死這些 MP3 的檔案、目錄名,不但充滿了中文,而且還有用中文 codepage 去編碼的非 ASCII 西文字元(如 Joaquín 中的 í),和日文平假名、片假名,這恐怕難搞…。
我 cd 到要轉換的根目錄,然後下:
find . -type f -name ‘*.mp3′ -exec mp3_tag_iconv-0.9c.pl -f cp936 {} \;
果然,有十幾個檔案名,Cygwin 無法處理,導致轉換失敗,但已經可以偷笑的是,這個方法對 95% 以上的檔案都 work。
分別找出了哪些檔名有問題的,發現一個有趣的現象 — 只要是中文的,都沒問題,有問題的都是那些日文歌,還有一兩個西文的。這似乎意味著,只要是和 OS 本地編碼設定一致的(中文),Cygwin 就 OK,否則,如果是那些違反自然,在中文系統下硬編成日文的檔名,則會有問題。
沒什麼其他好方法了,幸虧有問題的只有十幾個。於是使用低科技的解決方法,將它們一一改名為 ASCII 檔案、目錄名,重新執行轉換指令。終於結束了一場 Media Player 帶來的災難。
很久沒去升級 Media Player 了,不知道最新版針對 ID3 編碼的問題上,是否已經改進。已經換了好幾代了,也該是搞對的時候了吧!
附帶一提:分享一個好東西 — 講究音質的網友,如果要將 audio CD 上的音樂轉成 MP3,千萬別用 iTune 或 Media Player(如果上述的經歷還不足以讓您拋棄它)。在此推薦 LAME (唯一的缺點是轉換速度較慢,因為演算法較為複雜)。針對 iTune 轉 MP3 音質不佳,有一種個陰謀論 (conspiracy theory) 的猜測是,iTune 裡面故意要把 MP3 編碼模組做爛一點,相較之下,如果選擇用蘋果獨家的 AAC (m4a) 格式,則音質好得多,這麼做是鼓勵用戶盡量採用方便他們鎖定用戶的 AAC 格式 。
LAME 的名字也超酷 — LAME Ain’t an Mp3 Encoder,連名稱縮寫都玩遞迴,讓我想起 GNU — GNU is Not Unix。不只如此,lame 的英文原意為 「跛」 或 「拙劣」,似乎命名者又有點自我解嘲或謙虛的味道。