參考《字元,位元組和編碼》
來自:http://www.regexlab.com/zh/encoding.htm
##########################################################################################
e.g. 一段c程式
puts("中文"); // 0xd6 0xd0 0xce 0xc4;
實際上告訴顯示系統 尋找這個串[d6d0cec400] 的字元圖形,顯示到螢幕上。
問題:
1,預設的語言環境,也就是ansi是什嗎?
2,有沒有使用指定ansi字元編碼來索引圖形的字型檔?
3,指定的這個ansi可以正確解碼以上這個byte序列嗎?
4, 運行時候setlocal()什麼時候會起作用?
思考:
1,編寫這段程式的系統的預設ansi是什嗎?或者說儲存這份檔案的編碼是什嗎?這決定了c語言的多位元組字串如何在二進位程式裡面儲存。
2,編譯時間候,為了讓編譯器能夠正確處理多位元組字串的字面值,e.g. “中文”, 編譯選項裡應該指明(--encoding ???)和源碼儲存時候一致的編碼。
3,或者讓編譯器可以從源碼中探測到源檔案的儲存編碼(BOM, #pragma setlocal(???)),以便於理解源檔案中的多位元組字串。
4, 運行時候setlocal(???)必須指定和二進位中字串一樣的ansi編碼。
實驗:
//#pragma setlocal(.950)#include <stdio.h>#include <locale.h>int main(void){//setlocale(LC_ALL, ".950");printf("中華");return 0;}
中文windows(ansi是chs_chn.936)下的專案檔一般都是gbk編碼的(vs預設擷取系統的ansi來建立源檔案的編碼).
移植到linux下可以在Makefile裡面設定gcc --input-charset=GBk -c gbk_src.c -o utf-8_obj.o
關於目標檔案中字串編碼:
-fexec-charset,c檔案裡面的常量字串"abc$中文"轉碼成指定的編碼以後儲存。
-fwide-exec-charset,指定wchar_t x [] = L"中文"; x的儲存方式,linux預設是ucs-4be,因為預設的wchar_t是4個位元組的。如果你指定的-fshort-wchar_t會造成二進位上的不一致。