C 中的中文編碼 亂碼的根源及解決方案

2021-10-04 03:53:26 字數 1657 閱讀 6262

總結

ascii規定了127個字元編碼,而乙個位元組最多能表示256種。所以可以根據第一位來判斷是不是ascii編碼,如果不是說明這是乙個多位元組編碼。

char 與 std::string,英文本元在 utf-8 中使用乙個位元組儲存,中文字元使用三個位元組儲存。

c++ 11 開始支援 utf-8、utf-16 和 utf-32 字串常量的宣告,分別使用 u8""、u"" 和 u"" 作為宣告的標誌。

wchar_t 與 std::wstring解決多字元編碼,佔兩個位元組,且需要使用適配的 std::wcout 和 std::wofstream。windows中的編譯器一般將wchar_t定為2個位元組寬,而linux中的編譯器一般定義wchar_t為4位元組寬。用常量字元給wchar_t變數賦值時,前面要加l。如: wchar_t wch2 = l』中』;用常量字串給wchar_t陣列賦值時,前面要加l。如: wchar_t wstr2[3] = l」中國」。

編碼場景:

亂碼的根源:源**檔案(原始碼字符集)經過編譯/鏈結,生成可執行檔案(執行字符集),最後程式執行於實際環境中(執行環境編碼)。在這過程中如果有字符集不匹配,最終就無法顯示預期的文字資訊,甚至產生亂碼。

總結起來,要想使程式不會亂碼,必須滿足:

**相關

一般在程式中為了支援國際化,在程式初始化時,將 locale 設定為系統配置的 native ansi 字符集,即執行:setlocale(lc_all, 「」)。

可以檢視檔案編碼格式:

:file main.cc

main.cc: c++ source text, utf-8 unicode text

gcc的原始碼字符集與執行字符集預設都是utf-8編碼,也就是說預設情況下gcc都是按utf-8來解析原始碼,編譯後的執行字符集也是utf-8。當然gcc也提供改變預設情況的編譯選項:

-finput-charset=charset 用於指定原始碼字符集

-fexec-charset=charset 用於指定執行字符集

還有乙個引數是:

-fwide-exec-charset=charset
預設情況下,gcc在windows平台下,寬字串串常量的每個字元是16位utf-16型別,在linux平台下,寬字串串常量的每個字元是32位utf-32型別,使用-fwide-exec-charset=charset這個引數,可以改變寬字串串常量的型別。例如在x86的機器環境,linux作業系統下,要使例如 l"漢字" 編譯後儲存為utf-16的字串,則可以使用 -fwide-exec-charset=utf-16le。

控制台檢視編碼:

:locale

lang=

"zh_cn.utf-8"

lc_collate=

"zh_cn.utf-8"

lc_ctype=

"zh_cn.utf-8"

lc_messages=

"zh_cn.utf-8"

lc_monetary=

"zh_cn.utf-8"

lc_numeric=

"zh_cn.utf-8"

lc_time=

"zh_cn.utf-8"

lc_all=

參考

解決mysql中文亂碼的根源

解決mysql中文亂碼的根源 在mysql的安裝目錄下 筆者安裝的mysql目錄是d mysql 5.0.20a win32 建乙個my.ini檔案,其內容如下 winmysqladmin server d mysql 5.0.20a win32 bin mysqld.exe mysqld base...

JSP中文亂碼的根源

jsp程式存在有與servlet程式完全相同的中文亂碼問題 輸出響應正文時出現的中文亂碼問題 讀取瀏覽器傳遞的引數資訊時出現的中文亂碼問題 jsp引擎將jsp頁面翻譯成servlet原始檔時也可能導致中文亂碼問題 jsp引擎將jsp原始檔翻譯成的servlet原始檔預設採用utf 8編碼,而jsp開...

解決DOS中的亂碼以及編碼

作業系統 windows7 64 bit 昨天安裝了oracle11g 安裝完後並沒有立刻重啟,第二天重啟機器的時候,發現由原來的開機時間36秒變成了1分22秒,今天就突然想優化一下開機速度 把oralce的相關服務停掉,等用的時候再起來。後來想想,總是去服務裡面停比較費事,乾脆寫個批處理命令來開啟...