:::

純文字檔案的編碼與內文批次轉換:Big5轉UTF-8 / Batch convert Plain Text Files for Encoding and Content Replacing: Big5 to UTF-8

image

圖書資訊與檔案學領域中時常使用XML作為交換後設資料的格式。然而,由於早期系統大多為大五碼Big5編碼,並不能夠直接相容於現在的主流使用的萬國碼Unicode編碼,特別是比較常用的UTF-8編碼。如果要將XML這種純文字格式的檔案從Big5轉換成UTF-8的話,除了拜託程式設計師撰寫轉碼工具之外,我們也可以用Windows上現成的免安裝軟體ConvertZNotepad++Portable來完成這件事情。讓我們來看看怎麽操作吧。


問題敘述:何為Big5編碼的純文字檔案 / Problem: What's the plain text file in Big5 encoding?

image

首先,我們要瞭解我們要處理的問題是什麼。我有一個用Big5編碼的XML檔案,然後使用Notepad++開啟後,就得到了上面這張圖的畫面。這個檔案中,我們要處理什麼問題呢?

image

這邊其實有兩個問題:

  1. 檔案內文的取代:「encoding = 'Big5'」,應該要改成「encoding = 'utf-8'」。
  2. 檔案編碼的轉換:「ANSI」意思為Big5,應該要改成UTF-8,但這個卻是大部分人都會忽略的關鍵
解開誤會:檔案內文跟檔案編碼 / Misunderstanding: File encoding and file content

這個Big5編碼的檔案如果要轉換成utf-8編碼,我們必須要處理兩個問題:檔案內文與檔案編碼的轉換。這兩個問題需要個別處理,而且兩者各不相干。

image

當你讀到檔案內容寫著「encoding = 'Big5'」的時候,表示這個檔案的內文需要取代成「encoding = 'utf-8'」。檔案內文的取代,我們使用Notepad++來處理。

但這件事情是檔案內文的問題,跟這份檔案的編碼是不是utf-8,沒有任何關係。

image

當你用Notepad++開啟檔案時,發現右下角的編碼處顯示的是「ANSI」,意思是這個檔案是Big5編碼,表示這個檔案的內文需要轉換成utf-8。檔案編碼的轉換,我們使用ConvertZ來處理。

但編碼轉換這件事情只是在處理檔案編碼,並不會影響檔案的內文,不會變動檔案內文中的「encoding = 'Big5'」。

因此,請根據你現在檔案的狀況,來決定現在要做的事情是要做檔案內文的取代、還是要用檔案編碼的轉換、還是兩者都要做。

弄清楚現在要處理的狀況之後,讓我們繼續看看怎麼處理這兩個問題吧。


範例資料:Big5編碼的XML檔案 / Example data: XML files in Big5 encoding

image

為了示範如何處理檔案編碼轉換和檔案內文取代這兩個問題,我準備了使用Big5編碼、內容也寫著「encoding = 'Big5'」的三個範例檔案,供大家練習操作使用。

image

請下載範例檔案並解壓縮,就可以看到這三個XML檔案。檔案內容就如上面說明問題的狀況一樣,它需要做檔案編碼的轉換,也許要做檔案內文的取代。前者我們使用ConvertZ來操作,後者我們用Notepad++Portable來操作。


工具 / Tools

本篇會用到的兩個工具都是Windows中的免安裝軟體:

ConvertZ

image

ConvertZ是李志成所撰寫的中文內碼轉換器。通常這個工具是用來做簡體中文轉換成正體中文之用,但其實它內建了更為強大的編碼轉換工具,可以讓我們一口氣將大量的Big5編碼檔案轉換成utf-8編碼,非常好用。

我以前寫過使用Notepad++將純文字檔案轉換成utf-8的方法,但那個只能一次轉換一個檔案。如果要轉換大量檔案的話,還是推薦使用ConvertZ。

可惜作者的網址已經不能連線,目前也找不到ConvertZ的官方網站。只能提供別的網站上的軟體介紹供大家參考:

Notepad++Portable

image

Notepad++是我最推薦的純文字檔案編輯器。Notepad++不僅開源免費,還有免安裝版本可供使用。雖然我們也能夠用Notepad++來轉換檔案編碼,但這次我們主要是用它的另一個特色功能:搜尋目錄中檔案的內文,並且直接取代成我們要的字串。

上述的ConvertZ跟Notepad++都是免安裝版本,下載後是一個zip資料夾,請直接解壓縮,並開啟目錄底下的exe副檔名檔案,像是「ConvertZ.exe」或「notepad++.exe」,就可以使用了。


檔案編碼的轉換:使用ConvertZ / Converting the encoding of files with ConvertZ

image

接下來我們要用ConvertZ來將大量檔案的檔案編碼從Big5轉換成UTF-8。ConvertZ功能雖然強大,但是操作上稍微複雜了一些。讓我們一步一步來看看怎麽操作:

Step 1. 開啟ConvertZ的檔案轉換 / Open the file converter in ConvertZ

image

將上面下載的ConvertZ解壓縮後,請直接開啟裡面的「ConvertZ.exe」檔案。但是開啟後並不會出現任何視窗。ConvertZ去哪裡了呢?

image

事實上,ConvertZ會出現在右下角的通知區域中。如果你沒看到ConvertZ的齒輪圖示image的話,請按下通知區域的顯示隱藏圖示,找到ConvertZ的齒輪圖示,按下右鍵。

image

在ConvertZ齒輪圖示中的右鍵選單裡面,選擇「純文字檔案轉換」。

2018-08-21_205508 - Copy

這才是檔案編碼轉換的主要操作視窗。讓我們繼續下去吧。

Step 2. 檔案轉換設定 / Configuration for file encoding converting

在檔案轉換視窗中,我們要做四個動作:加入來源檔案、設定轉換檔案編碼、設定輸出目的地、開始轉換,讓我們來看看怎麽操作:

Step 2-1. 加入來源檔案 / Set input files

image

首先點選「來源檔案:」下面的按鈕,選擇需要轉換的目錄,然後下面就會列出目錄底下的檔案。

image

確認這些都是需要編碼轉換的檔案後,按下「全部加入」,這些檔案就會加入到右邊的檔案清單中。

Step 2-2. 設定轉換檔案編碼 / Encoding converting configuration

image

接下來我們要設定編碼轉換的細節,請按下「進階選項」。

image

輸入格式選擇「Big5」,輸出格式選擇「UTF-8」,設定好後按下「隱藏進階選項」按鈕。

Step 2-3. 設定輸出目的地 / Set output destination

image

再來我們要設定編碼轉換之後的檔案要存放的位置,請按下「目的地」底下的按鈕,選擇要輸出的目錄位置。我建議大家將轉換後的檔案存放在另外的位置,不要直接覆蓋原本的檔案。這樣子就算程式轉換發生了錯誤,也不會影響到原本的檔案內容。

Step 2-4. 開始轉換 / Start converting

image

確定來源檔案、編碼轉換、目的地都設定好之後,請按下「開始轉換」按鈕。

image

因為檔案很少,一下子就轉換完了。

Step 3. 檢視轉換成果 / Check results

image

打開前面設定目的地的目錄位置,我們可以看到剛剛來源檔案中設定的三個檔案都已經轉換完成並儲存在目的地目錄中。

image

讓我們用Notepad++開啟看看,會發現右下角的檔案編碼已經被改為「UTF-8」。

但細心的你應該也發現了,檔案第一行仍然寫的是「encoding = 'Big5'」。這也就是我前面所說的,檔案編碼的轉換並不影響檔案的內文,就算檔案編碼轉換成UTF-8了,也不會影響檔案內文所寫著的Big5。

所以接下來,我們就要用Notepad++來做檔案內文的取代囉。讓我們繼續往下看吧。


檔案內文的取代:使用Notepad++ / Replacing text in files with Notepad++

image

接下來我們要用Notepad++來將檔案內文的「encoding = 'Big5'」轉換成「encoding = 'utf-8'」。Notepad++功能繁多,這邊只會用到它的尋找目錄(Find in Files)功能就夠了。讓我們來看看怎麽操作吧:

Step 1. 開啟Notepad++的搜尋目錄功能 / Open "Find in Files" in Notepadd++

image[8]

從上面下載Notepad++ zip package 32-bit x86並解壓縮後,請點選「notepad++.exe」開啟主視窗。

image

從選單列開啟「搜尋」中的「搜尋目錄」。

image

然後就會出現搜尋目錄的對話視窗。我不確定為何我的Notepad++在這裡並沒有中文語系,就只有英文界面。不過也沒關係,語系並不影響我們操作。讓我們來看看這裡在搜尋目錄這裡要怎麼設定吧。

Step 2. 搜尋目錄設定 / Configuration in Find in Files

在搜尋目錄中,我們要五個動作:設定尋找內容、設定取代為、設定資料夾、全部尋找、執行在檔案中取代。不過在設定之前,我們必須要先討論一個問題:要尋找什麼?要取代什麼?

為什麼不是只將「Big5」取代成「utf-8」? / Why not replace only 'Big5' to 'utf-8'?

image

很多人在處理這個問題時,應該只想到單純地把「Big5」這四個字取代成「utf-8」。但實際操作的時候,這樣單純的轉換會造成許多無法挽救的錯誤

這是因為單純的「Big5」四個字並不只有出現在第一行XML標籤的encoding屬性中,而很有可能會出現在檔案內容中的各處。而我們想要取代的,只有XML標籤的encoding屬性中的「Big5」,其他檔案內容中有提到Big5的其他文字一概都不是我們要取代的目標。

這時候比較好的做法,是將要取代目標文字前後的文字也一併納入作為取代的目標。因此,我們不是搜尋「Big5」來取代成「utf-8」,而是加入前後的文字,改成搜尋「encoding = 'Big5'」來取代成「encoding = 'utf-8'必須注意的是,這裡面包含的空格、單引號必須與檔案內文完全一致,不然Notepad++會找不到你要取代的目標。

當然,更保險的做法是搜尋「<?xml version = '1.0' encoding = 'Big5'?>」來取代成「<?xml version = '1.0' encoding = 'utf-8'?>」。實務上,納入的前後文越多,就越不會發生取代錯誤的情況。在這裡我是因為這樣在寫blog的時候看起來比較累贅,所以就採用簡短的寫法。

有時候,你的檔案內文可能寫的是「encoding='big5'」,這樣子寫法的大小寫跟空格都跟我這篇的做法都不一樣,請根據你實際的檔案內容來選擇要尋找和取代的設定吧。

接下來,我們就來看看怎麽在尋找目錄中設定將「encoding = 'Big5'」取代成「encoding = 'utf-8'」吧。

Step 2-1. 設定尋找內容 / Find what

image

在搜尋目錄的視窗中的「尋找內容」設定為「encoding = 'Big5'」,請注意大小寫與空格必須跟檔案內文一致。

Step 2-2. 設定取代為 / Replace with

image

將「取代為」設定為「encoding = 'utf-8'」,請注意大小寫與空格必須跟前面的「尋找內容」一樣,只有「Big5」換成「utf-8」而已。

Step 2-3. 設定資料夾 / Directory

image

將「資料夾」指定為存放待處理檔案的資料夾。在目前的設定中,該資料夾底下的子資料夾也會納入尋找與取代喔。

Step 2-4. 全部尋找 / Find All

image

在取代之前,我們要先檢查是否真的可以找到需要取代的檔案及其內容。請按下「全部尋找」。

image

Notepad++的主視窗下面會顯示搜尋的結果,這時候可以檢查看看這樣的尋找目錄設定是否能夠完美找到我們需要轉換的所有檔案。這邊可以看到我們需要取代的三個檔案都被順利找到,而且也沒有其他的內文會受到影響。這樣就可以確認檔案內文的取代沒有問題,可以繼續來做取代的動作。

讓我們再從「搜尋」開啟「搜尋目錄」對話視窗,這時候對話視窗會保留前一次的設定,以便我們繼續操作。

Step 2-5. 執行在檔案中取代 / Replace in Files

image

接下來我們要正式來做取代的操作。在檔案中取代的這個動作無法復原,取代錯了也沒辦法快速還原到原本的內文,因此取代前請謹慎檢查設定。

在搜尋目錄中,確認尋找內容、取代為、資料夾的設定都正確之後,請按下「在檔案中取代」按鈕。

image

Notepad++會跳出一個確認視窗,確認你真的要取代檔案的內文。請按下「OK」繼續。

image

接著搜尋目錄左下角就會出現取代結果的訊息:「Replace in Files: 3 occurrences replaced」,這就表示有3個檔案已經被取代了。

Step 3. 檢查結果 / Check result

image

讓我們開啟剛剛取代完成的檔案來看看,可以看到檔案內文的「encoding = 'Big5'」已經被取代成「encoding = 'utf-8'」了。這樣就完成了檔案內文取代的工作了。

不過這邊還是要再提醒一次,檔案內文寫著「encoding = 'utf-8'」,並不代表它的檔案編碼就是UTF-8。我們還是要看看Notepad++右下角編碼是否正確地寫著「UTF-8」,這樣才是確認檔案編碼的正確方法。


其他純文字檔案轉換可能會遇到的問題 / Other issues when converting plain text

最後來講一下還有其他純文字檔案轉換時可能遭遇的問題,這兩個問題都能在Notepad++中發現與轉換,但如果要批次轉換大量檔案的話,可能要另尋其他做法了。

image

在Notepad++右下角的地方顯示著「換行格式」與「編碼」,如上圖所示,這裡採用的換行格式是「Windows (CR LR)」跟「UTF-8 BOM」,這是Windows最常產生的檔案格式,但是很多系統卻都不能使用這樣的設定。

  1. 換行格式應該採用Unix (LF):操作方法是「編輯 > 換行格式 > 轉換成UNIX格式」。
  2. 編碼不應該用UTF-8 BOM,而應該用UTF-8:操作方法是「編碼 > 轉換至UTF-8碼格式(檔首無BOM)」。

image

最後結果應該如上圖所示,使用「Unix (LF)」換行格式跟「UTF-8」編碼才是正確的做法。

關於換行格式議題跟BOM帶來的各種錯誤,我在這裡就不贅述了,請自行參考一下延伸閱讀:


小結 / In closing

檔案編碼轉換與檔案內文取代這兩件事情很常在各種電腦檔案處理的時候遇到。但意外的是,這對大部分的人來說,他們都覺得要完成這兩件事情的難度非常高。

不會寫程式的人,期待會寫程式的人來做這件事情。

會寫程式的人,開始煩惱要如何使用Java/Python/PHP裡面的函式庫來做字串比對與轉換,還要煩惱怎麽建構正規表達式,然後寫了很多程式碼來完成這兩件工作,對此非常自豪。(但這時候寫程式的人通常不會想到一般人要執行這段程式之前還要先佈署JRE/Python/PHP的執行環境)

我真的看過很多這樣的例子,像是這個「Convert Big5 To UTF8」或是「[問題] Python全文取代」。事實上,就如這篇所介紹的,檔案編碼轉換和檔案內文取代這兩件工作,用ConvertZ跟Notepad++這種免費軟體就能夠輕鬆完成了,不需要那麼大費周章啦。


那麼這次將純文字檔案的編碼與內文批次將Big5轉換成utf-8的教學就到這邊了。你有遇到檔案編碼轉換的問題嗎?你都是怎麽做轉換的呢?你需要取代檔案內文的時候,都是怎麽做的呢?歡迎在下面的留言處跟我們分享你的做法。如果你覺得我這篇教學寫的不錯的話,請幫我在AddThis分享工具按讚、將這篇分享到Facebook等社群媒體吧!感謝你的耐心閱讀,讓我們下一篇見。

總共3 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

  1. 由於Google Drive更改連結的形式。本篇用到舊連結的檔案已經更新了分享連結,在此做個記錄。

    回覆刪除
  2. 哇,今天太幸運了,搜尋到這篇文章,正好可以解決我例行性要將UTF-8轉換成Big5;
    同時也給我一個hint, Notepad++,可以錄製巨集
    譬如

    巨集一

    搜尋

    取代為


    巨集二

    搜尋
    N/A
    取代為
    (空白)

    這樣就更方便了
    還沒測試
    應該可以達成

    感謝再感謝!!


    回覆刪除
    回覆
    1. To 謝碧祥診所,

      恭喜!
      Notepad++真的好用啊

      而且是台灣人侯今吾開發的喔

      https://notepad-plus-plus.org/donate/
      請多多donate支持吧!

      刪除