是否曾經煩惱看不習慣 iTunes 裡顯示的曲目名稱是你看不懂的中文字體呢?例如你購買了一張大陸歌手的專輯,但 iTunes 抓到的曲目名稱是你所不習慣的簡體中文。Windows 有 ConvertZ 可以做到這件事,但 Mac OS X 可不能執行 ConvertZ 啊。

雖然我們知道在 Mac OS X 的「服務」功能表裡面,有「中文字轉換程式」,可以把中文在簡體和繁體之間轉換,但僅適用於可以反白選擇的文字範圍,就算你在 iTunes 裡選擇曲目,再執行 iTunes 功能表 → 服務 → 中文字轉換程式 → 轉換所選的簡體中文文字,但你會發現,IT DOES NOT WORK AT ALL!

一首一首改?你有更好的工具。


必備的工具及條件

  • 終端機軟體。
    可以使用內建的終端機 (位在 應用程式 → 系統工具 → 終端機),或使用開放原始碼的 iTerm
  • MacPorts 套件管理系統。
    可以在這裡下載安裝,選擇 dmg 格式;在安裝之前,你要先安裝 Xcode
  • 你的帳號要有系統管理員的權限。
  • 要轉換的歌曲名稱必須是 UTF-8 編碼 也就是你在 iTunes 看到的曲目名稱不可以是亂碼。你可以使用 ID3MOD2 來進行編碼更正。

下文所提及的「指令」都是在終端機軟體裡面操作的。

安裝 zh-autoconvert (libhz)

首先請下載並安裝 zh-autoconvert (libhz),這是一套可以在 BIG5 和 GB2312 編碼之間轉換的程式,轉換的同時還會自動轉換繁體和簡體。MacPorts 並沒有這套程式,官方網站上提供的 Tarball (.tar.gz) 解開來直接 make 編譯卻會發生編譯錯誤,所以只好抓 SCM 上面的原始碼回來編譯。不過 libhz 使用的 SCM 是 git,所以在抓回原始碼之前,要先透過 MacPorts 安裝 git:

sudo port install git-core

安裝的時間隨電腦硬體能力而異 (因為 MacPorts 安裝的軟體是要從頭開始編譯的)。

裝完了就可以透過 git 來取得 libhz 的原始碼:

git clone git://gitorious.org/libhz/mainline.git

接著你應該會在目前路徑裡看到一個名為 mainline 的資料夾,切換進去:

cd mainline

然後打入以下指令來編譯並安裝 libhz:

./autogen.sh
./configure
make
sudo make install
# [然後輸入你的密碼]

這樣 libhz 就裝好了。可以把 mainline 資料夾砍掉。


下載我寫的 AppleScript

請在這裡下載我爆肝寫出來的 AppleScript :

iTunes Song Name Converter between Chinese Varients Variants.zip

授權: GNU GPL v2.0

版權沒有,歡迎亂改 (不過改出來的東西也得是 GPL 相容的授權) 下載回來之後解壓縮開來,是一個 AppleScript 檔案,按兩下檔案,會開啟工序指令編寫程式。此時建議先按一下工序指令編寫程式視窗最下面的「Event 記錄」,切換到 Log 檢視,等下如果執行階段發生錯誤可以看。

iTunes 轉換�文�曲名稱繁簡體的 AppleScript


操作方法

首先在 iTunes 裡選擇你要轉換歌曲名稱的曲目。同時不可以選擇繁體字和簡體字,我不知道會發生什麼事XD

iTunes 轉換�文�曲名稱繁簡體的 AppleScript

然後回到工序指令編寫程式,按下工具列上的「執行」鈕 (綠色 Play 圓鈕),會詢問你轉換的方向:

iTunes 轉換�文�曲名稱繁簡體的 AppleScript

選擇你要的方向,就可以進行轉換了。轉換過程出現的訊息與錯誤會出現在下方窗格的 Event 記錄裡面:

iTunes 轉換�文�曲名稱繁簡體的 AppleScript

接著再回到 iTunes ,看看成果吧

iTunes 轉換�文�曲名稱繁簡體的 AppleScript


已知問題

眼尖的你應該會發現,有少數一些曲目轉換出來的字會有問題。我想這可以是 BIG5 傳說中的許功蓋問題,遇到這種情況只能手動打字了。至於範例裡的「泵叉」,是因為我在做這個示範的時候,先把繁體 (「掙扎」) 轉換成簡體,就出錯了。

另外,因為轉換的過程是直接 call Shell Script,所以如果曲目名稱裡面有雙引號 (“),則執行過程會發生錯誤而停止。這個時候也只能針對出錯的曲目名稱手動打字。我知道這裡可以用 Escape Character 的方式來解決,不過我目前試不出來 XD


技術細節

其實我是在尋找如何透過 AppleScript 呼叫 Safari 執行 JavaScript 的時候,意外發現 AppleScript 可以執行 Shell Script,又剛好前幾天 PTT 的 Mac 板有人提問說怎麼做歌曲名稱的繁簡轉換 (#19LxF9jS),這會兒就讓我想到可以直接把轉換的程序丟給 Shell Script 做。

問題就在於,哪來的繁簡轉換程式?既然系統服務功能表裡面的中文字轉換程式是無法使用的,那就勢必要丟給第三方程式來做。上網搜尋了好久,終於讓我找到這篇文章裡面提到 iconv 的轉換秘技:

iconv是用来转换编码的小工具。现在的iconv在执行编码从gb2312到big5的转化时,实现了简繁转换。

我試了一下,發現 Mac OS X 內建的 iconv 並不支援這項秘技 (而 Ubuntu Linux 的 iconv 是有支援的),因此只好試試看 zh-autoconvert (libhz)。又因為 zh-autoconvert 在 Mac OS X 沒有 Binary Package 也沒有被收進 MacPorts ,又費了好一番工夫才搞到原始碼,編譯出來,的確可以進行繁簡轉換。

最後就是 AppleScript 怎麼寫的問題了。我從沒寫過 AppleScript,不過實際在網路上參考範例的時候,發現 AppleScript 真的很像英文…。所以就這樣搞了一個晚上…XD


應該要有的改進

事實上,透過轉換編碼的方式來轉換繁簡體,根本是偷吃步的招數。最佳解應該是有一個只接受 UTF-8 輸入輸出的程式,這個程式有一張繁簡對照表,透過這個表來轉換,也不用擔心什麼許功蓋的問題。當然我們知道在服務功能表裡面就有這個小程式,不過它的使用困難已經在前文提及了。OpenVanilla 的打簡出繁/打繁出簡不知道能不能用啊?

我的期望是,它應該是一個具備 GUI  的程式,有一個拖曳區,從 iTunes 或 Finder 拖曳歌曲進來 (這意味著需要轉換的曲目不一定要在同一個 Playlist 或顯示範圍) ,然後選擇要轉換的方向,它就會把曲目名稱、專輯名稱、演唱者和檔名都幫你轉好了。不過我不會 Cocoa Programming,這對我來說還是太難了一點。希望有人可以做出完整解就是了ˊˋ

update: 另請參考 uranusjr 所寫的 GUI 版本


抄來的參考程式碼

本程式的完成仰賴以下範例: