情況一:檔案沒問題,只是顯示成 �
如果編輯器、播放器或瀏覽器裡滿畫面都是 �,通常是檔案用 Big5 儲存,卻被當成 UTF-8 讀取。Big5 的中文位元組在 UTF-8 裡不成立,程式就在顯示時換成替代字元 �。檔案本身的位元組還是正確的。
解決方法:把原始檔案拖到上面的框中。Mojibuster 會在讀取時辨識編碼,並把檔案轉成 UTF-8。詳細說明請見 Big5 轉 UTF-8。重要:請使用檔案本身,不要從程式裡複製文字,複製後 � 就會固定下來。
情況二:? 或 � 已經存進文字裡
如果程式把含有替代字元的文字儲存或傳送出去,原本的字就遺失了。? 也一樣:當目標編碼裡沒有某個字時,程式就會換成 ?。例如另存為 Big5 時,Big5 裡沒有的字(罕用字、簡體字、表情符號等)都會變成 ?;寫入不支援中文的資料庫欄位時也會這樣。
這種情況無法反推回去,因為每個字都變成了同一個符號。Mojibuster 不會亂猜,而是告訴你有幾個地方受影響。只能從來源下手:重新匯出,或使用備份。
出現問號的常見原因
- 資料庫:欄位或連線使用
latin1、big5或ascii,資料卻是以 UTF-8 送進來。MySQL 會把無法儲存的字換成?,請見 MySQL 與 phpMyAdmin。 - PHP:沒有指定 charset,網頁或資料庫連線用錯編碼,中文就可能變成
?或�。 - 記事本另存為 ANSI:在繁體中文版 Windows 中,ANSI 就是 Big5。Big5 以外的字(例如簡體字)都會變成
?。 - PowerShell 5.1:
Export-Csv預設寫成 ASCII,中文會變成?,請見 PowerShell。 - Python:
encode('big5', errors='replace')會默默把 Big5 沒有的字換成?,請見 Python 與 pandas。 - 命令提示字元:Windows 主控台會把字碼頁(CP950)裡沒有的字顯示成
?。通常只是顯示有誤,檔案本身沒問題。 - 舊的郵件軟體:用 Big5 寄送或讀取郵件時,Big5 以外的字可能變成
?。
如何判斷是哪一種情況
- 用能顯示編碼的編輯器開啟檔案,例如 Notepad++。如果狀態列顯示「ANSI」或「Big5」,就是情況一。
- 把檔案拖進 Mojibuster。如果結果顯示是以 Big5 讀取,而且文字恢復正常,就是情況一,請見 Big5 轉 UTF-8。
- 如果 Mojibuster 回報有遺失的字,就是情況二,只能重新匯出。
如果看到的不是問號,而是一堆奇怪的符號或不相干的字,那是另一種錯誤,而且多半可以修復:請見 亂碼是什麼。
常見問題
Mojibuster 能把 ? 變回原本的字嗎?
不能。一個 ? 可能代表任何字,資訊已經消失了。Mojibuster 不會更動這些地方,但會告訴你有幾處。
為什麼在一個程式裡看到 �,在另一個程式裡卻正常?
這表示檔案沒問題,只是其中一個程式用錯編碼讀取。用 Mojibuster 轉成 UTF-8 後,兩個程式都能正確顯示。
簡體字為什麼存檔後變成 ?
Big5 只收錄繁體字,沒有簡體字。另存為 Big5(ANSI)時,簡體字和其他 Big5 以外的字都會變成 ?。請改存成 UTF-8。
� 這個符號是什麼?
它是替代字元 U+FFFD。程式無法把某個位元組讀成文字時,就會插入這個符號。它表示編碼出錯,不是原本文字的一部分。