首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言中雙字節 ASCII 碼表示漢字的原理與實踐:從「我愛朱慧」到「我愛你」

     編輯:關於C語言

前言:一串神秘數字引發的探索

一切始於一個百度知道的問題:206 210 176 174 214 236 187 219 這串 ASCII 碼代表什麼中文?答案竟是「我愛朱慧」。這激發了作者對 C 語言中漢字編碼存儲機制的深入探索之旅。

核心發現:漢字佔用兩個字節

在 GB2312/GBK 等中文編碼體系下,一個漢字佔用兩個字節(16 bits)。C 語言中 char 型別僅 1 字節,因此輸出漢字時需連續輸出兩個 %c 格式字元,對應高低位字節:

printf("%c%c%c%c%c%c%c%c", 206,210, 176,174, 214,236, 187,219);
// 輸出:我 愛 朱 慧

對應關係如下:

  • 206 + 210 = 「我」
  • 176 + 174 = 「愛」
  • 214 + 236 = 「朱」
  • 187 + 219 = 「慧」

暴力窮舉尋找「你」字編碼

作者編寫循環程式,測試 129~247 範圍內的字節組合,記錄了大量雙字節對應的漢字(如 186+186=漢、187+187=換、191+191=靠 等),但始終未找到「你」字。這反映了 GB2312 編碼並非簡單的線性映射,而是分區位碼(區碼 16-55,位碼 1-94)。

正確解法:利用編譯器自動推導

參考資料二指出:C/C++ 中漢字以兩個有號字節(負數)形式存儲。利用這一特性,可直接打印漢字的內部編碼:

char s[] = "你";
printf("%d %d\n", s[0], s[1]); // 輸出:-60 -29

將這兩個負數作為 %c 參數傳給 printf,即可正確輸出「你」。最終完美實現「我愛你」:

printf("%c%c%c%c%c%c\n", 206,210, 176,174, -60,-29);

深層原理:GB2312 區位碼與 ASCII 的換算

GB2312 編碼 = 區位碼 + 0xA0A0(即高低位各加 160)。
例如「啊」區位碼 1601 → 區碼 16+160=176,位碼 01+160=161 → 機內碼 B0A1(有號字節為 -80, -95)。

總結與教訓

  1. 漢字在記憶體中是雙字節,不可當作單一 char 處理。
  2. 負數字節值是有號 char 表示高位元組(MSB=1)的結果,並非錯誤。
  3. 勿硬編碼數字,應使用字串字面常量 "中文" 讓編譯器處理編碼轉換。
  4. 現代開發請統一使用 UTF-8,避免 GB2312/Big5 等舊編碼帶來的跨平台亂碼問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved