C C 字元亂碼研究

2021-09-11 02:16:35 字數 1383 閱讀 8034

字串顯示到ui介面上大致有三個階段:原始檔編碼格式、編譯儲存編碼格式、執行編碼格式

1,原始檔編碼格式

我們的c/c++原始檔一般有gbk、unicode(utf8、utf16、utf32)等編碼格式,其中utf8分為帶bom和不帶bom,bom其實就是標記雙位元組或者四位元組字元是大端還是小端儲存,所以其實utf8是不需要bom標記的。vc編譯器不認不帶bom的utf8檔案,也就是vc編譯器會把不帶bom的utf8原始檔當成ansi編碼處理,這種情況下如果你的**裡的字串有中文字元肯定會亂碼,原因是編譯器不能正確轉換字串到儲存編碼格式。 

2,編譯儲存編碼格式

即編譯器將原始檔中的字串常量(例如字串 "中國" )編譯儲存到靜態儲存區中所用的編碼格式 ,說明下 :l"中國",u"中國",u"中國" 等字串常量顯示指定了儲存編碼格式,編譯器會按照你指定的去轉碼儲存到靜態儲存區。 那麼 char str = "中國" 這種字串編譯儲存編碼到底用什麼格式呢?分兩個階段,首先在編譯後字串"中國"就存在靜態儲存區,然後執行時用這個記憶體初始化字元陣列;

(1)vc編譯器在在vc下和本地化locale有關,如果你的系統是簡體中文那vc編譯時會把字串轉成ansi編碼來儲存,當然你可以通過指令更改:

方式一,工程屬性 》配置屬性 》c/c++ 》命令列 》其他選項,在這裡輸入/execution-charset:utf-8,那麼整個工程中的字串都將轉碼成utf8作為儲存編碼格式;另外在vs2015中還有指令/source-charset:utf-8指示原始檔是utf8格式,指令/utf-8指示原始檔編碼和編譯儲存編碼都是utf8,對於原始檔是無bom的很有效。

方式二,在原始檔裡加#pragma execution_character_set("utf-8")指令,這個只對該原始檔有效。

(2)g++、mingw編譯器linux下的編譯器大多都是原始檔是什麼編碼那麼編譯儲存就採用什麼編碼格式,支援編譯引數指定格式,-finput-charset指定原始檔採用什麼格式,-fexec-charset指定編譯儲存採用的編碼格式。

3,執行編碼格式

執行編碼格式可以通過 setlocale設定,setlocale( lc_all, "c" )設定執行編碼為ascii,setlocale( lc_all, "chs" );設定簡體中文,即執行時exe裡的字串當成ansi處理,比如說你呼叫乙個帶有字串的系統api(非寬字元版本api),這個api的字串將被當成ansi編碼;windows好像是不支援setlocale( lc_all, "utf8" )。

所以只有編譯器正確識別原始檔編碼,然後儲存編碼和執行編碼一致才不會亂碼;

字元編碼研究

應用開發中,經常會遇到亂碼的問題,對於新手尤其如此。為了解決亂碼問題帶來的困擾,特整理一下字元編碼的相關知識,從根本上杜絕亂碼的出現。一,相關概念 在計算機的世界中,所有的資訊都是由01組成的二進位制資訊,當然也包含字元。字元是各種文字和符號的總稱,包括各國家文字 標點符號 圖形符號 數字等。那麼如...

mysql 字元亂碼 mysql字符集亂碼

很不多不注意資料庫的亂碼情況,導致字元出錯 預設的是拉丁字符集 在這個庫裡面建立的表也是拉丁字符集 下面插入正常的資料 顯示是正常的。當插入中文的時候 必須要把客戶端設定為拉丁字符集。另一種方法是在外面編輯xpg.sql 然後用system倒入進去 mysql不亂碼的5種方法及不亂嗎根源 set n...

c c 轉義字元

c語言常用轉義字元 轉義字元 含義ascii碼 16 10進製 a響鈴 bel 07h 7 b退格 bs 08h 8 f換頁 ff 0ch 12 n換行 lf 0ah 10 r回車 cr 0dh 13 t水平製表 ht 09h 9 v垂直製表 vt 0bh 11 反斜槓 5ch 92 問號字元 3f...