中文亂碼
中文亂碼是電子資訊系統的中文無法正確顯示文字符號的一種現象,在中文內碼未有標準時情況尤其嚴重[1]。
「萬碼奔騰」的年代
在過去,由於繁體中文用戶缺乏一個具有號召力的內碼標準,不同用戶都會使用各自的標準。比較普遍的是銀行由於主要使用IBM的商業電腦,很自然地亦選擇了IBM 5550作為其內碼標準。這些用5550內碼的檔案,一旦下載到電腦上,若要轉寄與其他人使用,就要透過轉碼換成Big5,其他人才可以閱讀。
另一方面,在會計界有不少人都直接使用外國的專門軟件,而為免衝碼問題使畫面凌亂,不少的IT部門都把公司電腦的內碼換成倚天碼。本來會計人員過去只是把計算結果列印而提交報告,並未有任何問題。到後來隨着電子表格的興起,用戶才發覺到當公司與外界使用的內碼不同,會引起不少問題,亂碼的問題才開始得到重視。
中文Big5碼被誤認為EASCII
歐洲生產的某些電腦並無法辨識Big5雙位元字碼的中文字元,相反的,它們會把位於00到7F間的字碼視為ASCII,而80到FF間的字碼則視為EASCII,例如:
中文字 | 維 | 基 | 百 | 科 | 中 | 文 | 大 | 五 | 碼 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Big5碼的高位/低位位元 | BA | FB | B0 | F2 | A6 | CA | AC | EC | A4 | A4 | A4 | E5 | A4 | 6A | A4 | AD | BD | 58 |
對應的ASCII/EASCII字元 | º | û | ° | ò | ¦ | Ê | ¬ | ì | ¤ | ¤ | ¤ | å | ¤ | j | ¤ | | ½ | X |
也因此,中文字串「維基百科中文大五碼」會顯示為亂碼「ºû°ò¦Ê¬ì¤¤¤å¤j¤ ½X」。
UTF-8與Big5的相互轉換
隨着UTF-8的普及化,許多繁體中文的IRC頻道也逐漸從Big5轉變成UTF-8;然而在這種過渡時期中,仍然有不少IRC頻道是採用Big5的,所以用戶參與了新的頻道時,通常會想要先確定自己的字元編碼有沒有設錯,人們最常用的測試字眼不外乎:
編碼 | 內容 | ||
---|---|---|---|
UTF-8 | 中文 | 測試 | 導航 |
Big5 | 銝剜�� | 皜祈岫 | 撠舘⏛ |
嚙踝蕭亂碼問題
當一段大五碼文字被錯誤地以UTF-8解碼再編碼再以大五碼解碼,由於在被以UTF-8解碼時的無效字元被以Unicode的「未辨識字元(U+FFFD)」作為內碼記錄,而那替代字元的UTF-8編碼的十六進制為「EF BF BD
」。當那替代字元因為按UTF-8解碼會出現大比例的無效字元而令其大片大片地出現,進而在被UTF-8再編碼再以大五碼解碼後讀碼框取到UTF-8替代字元的編碼的第一個位元組和第二個位元組的十六進制「EF BF
」解碼得到「嚙」字,接下來的讀碼框橫跨兩個UTF-8替代字元取到第一個UTF-8替代字元的第三個位元組和第二個UTF-8替代字元的第一個位元組的十六進制「BD EF
」解碼得到「踝」字,再接下來的讀碼框取到第二個UTF-8替代字元的第二個位元組和第三個位元組的十六進制「BF BD
」解碼得到「蕭」字,連起來就是「嚙踝蕭」。這樣的情況反覆出現就令其中出現大量「嚙踝蕭」字樣。並且由於在被以UTF-8解碼時所出現的各種無效字元與有效字元的各種組合,再以大五碼解碼後其中會有許多不是出現在「嚙踝蕭」子序列中的「嚙」、「蕭」字樣。
另外其他編碼的非UTF-8文字或非文字二進制數據被錯誤地以UTF-8解碼再編碼再以大五碼解碼也會如上產生嚙踝蕭亂碼,然而由於原位元組序列的特徵會部分地傳遞至以UTF-8解碼後所產生的中間階段亂碼,這樣因此由這些方式產生的亂碼跟大五碼文字被錯誤地以UTF-8解碼再編碼再以大五碼解碼所產生的亂碼便具有不同的特徵。
簡體中文編碼體系產生的亂碼
在中文互聯網上流行着一個冷笑話,總結了簡體中文編碼中經常出現的亂碼:[2][3]
手持兩把錕斤拷,口中疾呼燙燙燙。 腳踏千朵屯屯屯,笑看萬物鍩鍩鍩。
錕斤拷亂碼問題
在Unicode編碼與簡體中文編碼系統(例如GB 2312、GBK、GB 18030、CP936)轉換時,部分簡體中文編碼的文字在Unicode編碼中並不存在,Unicode會以「未辨識字元(U+FFFD)」作為內碼記錄,而對外以UTF-8表現為EF BF BD
,當多個EF BF BD
連續出現,而且以簡體中文編碼去解釋的話,就會被解析為多個「锟斤拷」。三個字的編碼分別是锟(0xEFBF)、斤(0xBDEF)、拷(0xBFBD)。
「燙燙燙」與「屯屯屯」
在Visual C++中,以除錯模式執行程式時,未初始化的棧空間被以0xCC填充,而未初始化的堆空間則是0xCD。當不小心以字串形式輸出了這些未初始化的內容時,系統會以GBK編碼解析為一連串重複的「烫」(0xCCCC)或者「屯」(0xCDCD)。
UTF-8 BOM與「鍩」
Windows作業系統中,將文字檔案儲存為UTF-8格式時會在檔案開頭添加位元組順序標記EF BB BF
,當檔案以GBK編碼打開時,開頭兩個位元組會被解析為「锘」(0xEFBB)。
產生的問題
過往,亂碼所產生的問題,往往只是閱讀上的不方便,因為文字變成了亂碼,使用戶看不到文字的內容。然而,現時由於電腦軟件保安設計的問題,亂碼隨時可能會使應用程式不正常關閉。
參見
參考文獻
- ^ 蔡學鏞. IT中文環境的血淚史(1)作業系統、編程語言、應用亂碼. iThome 電週文化. 2007-06-17 [2024-02-24]. (原始內容存檔於2024-02-24) (中文(臺灣)).
- ^ 计算机领域有哪些经典的典故或笑话?. 知乎. 2014-03-08.
- ^ 1 分钟带你认识从 "�" 到 "锟斤拷". 搜狐. 2021-02-16 [2023-11-14]. (原始內容存檔於2023-11-14).