從程式亂碼開始談談字元編碼

來源:互聯網
上載者:User

參考《字元,位元組和編碼》

來自: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會造成二進位上的不一致。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.