國外程序員也燙屯錕斤拷嗎?

如果是/不是,為什麼?


經常跟亂碼打交道的路過。。。

簡單答案:全世界都有類似的情況,但看到的和我們可能不一樣。

具體來說嘛~
首先,「燙燙屯屯」和「錕斤拷」是兩個不同的問題,但都和 GBK 編碼相關。
另外還有人提到「許蓋功」、「變巨」、「林技誇」什麼的,下面分別來談~

一、「燙燙屯屯」

這是 Visual Studio 在調試模式下編譯的 C/C++ 程序中可能遇到的東西。源自 VC++ 編譯器在調試模式下會將未初始化的內存空間用 0xCC 和 0xCD 填充。但由於 Windows 控制台在不同語言下會用不同的編碼,不同語言下效果會不一樣。

比如同樣是「八個 0xCC 位元組」和「八個 0xCD 位元組」:

  • 簡體中文 Windows 採用 CP 936 編碼(即 GBK),"xCCxCC" 為「燙」、"xCDxCD"為「屯」,因此顯示「燙燙燙燙」和「屯屯屯屯」。
  • 英文 Windows 採用 CP 437 編碼(又稱 IBM 437):"xCC"為「╠」、"xCD" 為「═」,因此顯示「╠╠╠╠╠╠╠╠」和「════════」。
  • 繁體中文 WIndows 採用 CP 950 編碼(即 Big5):"xCCxCC" 為「昍」、"xCDxCD"為「迋」,因此會顯示「昍昍昍昍」和「迋迋迋迋」。
  • 日文 Windows 採用 CP 932 編碼(即 Shift-JIS):"xCC"為「?」、"xCD" 為「?」,因此顯示「????????」和「????????」。

其他語言下基本會被直接當成普通亂碼或普通 bug 了……(要怪就只能怪 GBK 的這兩個碼位恰好都是常用字了吧2333)


二、「錕斤拷」

如果數據來自網路自動收集處理的話經常會有程序將編碼判斷錯的問題。所以搜索引擎的網頁資料是重災區。

「錕斤拷」是在 GBK 和 UTF-8 編碼的兩種數據混用時會發生的現象。

要產生「錕斤拷」這個串,需要幾個步驟——

  1. 把一段位元組序列用錯誤的編碼轉成 Unicode 字元序列(一般用字元串來製作索引),並使用 Unicode 指定的替代用字元「U+FFFD」替代所有轉換失敗的字元。
  2. 將這段字元序列以 UTF-8 編碼儲存為位元組序列(字元串需要採用一個統一的內部編碼來保存,一般用 Unicode 的某種編碼),連續的兩個「U+FFFD」會表示為 "xEFxBFxBDxEFxBFxBD"。
  3. 再將這段位元組序列錯誤地以 GBK 編碼呈現為字元序列(程序 bug,把內部數據編碼搞混了),即出現「錕斤拷」。

如果把上面的 GBK 換成 Big5,出現的會是「嚙踝蕭」。
換成 IBM 437,出現的會是「∩┐╜∩┐╜」。
Shift-JIS 下是不合法編碼,會變成什麼樣(或者能不能出現這個 bug)就不一定了。

所以其他語言下估計也會直接被當成普通亂碼什麼的……(大概還是得怪 GBK 這三個碼位不僅兩個是常用字而且三個字之間還有奇妙的意義關聯了吧2333)


三、「許蓋功」

這是由於 Big-5 碼一些字元的第二位元組跟 ASCII 下大量字元重疊,而某些字元在 Unix 命令行、程序代碼中可能有特殊作用,往往導致字元串被不正確地解釋。這只會發生在 Big-5 環境下。這就是 Big-5 的設計缺陷了。。

其實 GBK 下偶爾也有類似的情況,比如某些用 GBK 編碼處理 LRC 歌詞的播放器。由於 GBK 某些字第二位元組 0x5B 與 LRC 標籤起始字元「[」重疊,如果直接用按位元組來找起始字元的話會導致這些不幸的字與它後面的文本全被當成標籤。。而且這一般會在日文歌詞中發生,簡體中文一般遇不到所以還不太有開發者關注……當然如今普遍是內部統一用 Unicode 字元處理,只要能正確識別文件編碼就不太有這種問題了。


附:「變巨」「林技誇」

這是在簡體中文系統運行為其他語言系統開發的程序時,由於程序內的文本並未使用相符的編碼,也未使用 Unicode 於是編碼錯亂所致。

「曹操」用 Big5 編碼成位元組序列後,再被誤當成 GBK 轉為字元得到的即是「變巨」。
類似的還有「三國志曹操傳」變成「 ?T瓣в變巨肚」。第一個位元組在 GBK 中是不合法編碼,在 Windows 上呈現時會變成問號或直接忽略,現今 Unix 諸系統一般會用 U+FFFD 顯示。(另外注意那個「в」是西里爾字母小寫 ve,不是 B)
此外還有反過來的情況,比如在內嵌字型的 Big5 遊戲中,字元「曹操」被系統用 GBK 位元組序列表示,但會被內嵌的字型當成 Big5 而顯示成字元「羚紱」。

而「???」(韓文常見的句尾)用 CP 949 編碼(即 KSC5601 編碼),再被誤作 GBK 轉為字元得到的即是「林技誇」。


只要涉及到DBCS(double-byte character set 雙位元組字符集)的場合,都可能出現類似的問題。
服務員,給我來一份條碼||||魚頭,外加唰T潺和牛咕嗔。


比如??


去微博翻出了Ubuntu for windows公開測試時我打開bash時出現的bug… 笑了我一整天


有圖有真相!我在美國藥店買葯的收據:


許蓋功。


題主想問國外程序員也什麼??你的問題里有亂碼。


不會。

因爲這幾個問題都跟 GBK 有關。人家老外沒事用什麼 GBK 啊。


亂碼問題是全世界都存在的問題。2001年第一次去台灣考察的時候,看到921大地震紀念館裡一張剖面圖上出現的亂碼時,我專門拍下來了,不光是程序員,CAD畫圖員一樣經常碰到字體不同亂碼的情況啊。這個是全世界都存在的問題。


哈哈哈看到題目還反應了一下


只要存在編碼問題就一定會存在這種現象。你以為老外就不用utf-8和iso 8859?而且老外又不是只說英語,法語德語西班牙語日語都是要編碼的。


錕斤拷應該沒有(吧?)除非湊上了GB字符集。
亂碼普遍存在。有各路字符集存在就有亂碼。

ヾ(°?°ヾ)^?燙燙燙


英文世界最常用的兩種編碼字符集:ISO-8859-1與Windows-1252,就是不完全兼容


這和中文編碼方式有關吧,老外一般不用中文吧,不過在國外的華人程序員也許有這種問題呢!


會碰到同樣的現象,但是顯示的肯定不會是錕斤拷燙燙燙之類的


推薦閱讀:

為什麼代碼都是用英文來寫的,將來會有用中文寫代碼的那天嗎?
系統軟體到底裝在哪個盤比較好?
windows中文件或者文件名是按照什麼原則排序的?命名時有什麼技巧?
為什麼把軟體下載安裝到d盤但c盤的空間越來越少,57G的c盤夠用嗎?
你為什麼從海康威視離職?

TAG:計算機 | 軟體工程 | 字元編碼 |