聊聊字元編碼那些事

2021-09-25 00:00:26 字數 1824 閱讀 9664

計算機字元編碼的歷史

在windows作業系統下可以通過命令列模式檢視系統使用的字符集,如下圖所示:

從圖中看到,活動頁**為936,代表gb2312(簡體中文)。作者的個人計算機安裝的是windows10簡體中文版。

microsoft visual studio整合開發環境採用的字元編碼是作業系統使用的字元編碼。

qt creator整合開發環境的字元編碼,可以設定,如下圖所示。作者的qt creator版本為4.2.0(community)

這裡需要注意,選擇檔案編碼後重啟qt creator設定才能生效。

qstring使用的是unicode編碼,在不通過qtextcodec類設定qstring的編碼方式下,qstring的建構函式預設呼叫fromlatin1函式將字串轉為unicode編碼(即qstring認為字串採用的是latin1編碼)。在這種情況下輸入中文就會顯示亂碼,因為latin1編碼無法解釋中文,更不用說轉換為unicode編碼後正確顯示中文了。有以下兩種方法可以避免中文顯示亂碼的方法。

1. 區域性編碼

// gb2312轉unicode 區域性編碼

// 方法a

qbytearray gbk2312string = "中文"; // 檔案的編碼方式為gb2312,所以「中文」這兩個字的編碼方式為gb2312

qtextcodec *codec = qtextcodec::codecforname("gbk"); // 函式輸入引數gbk,代表了三種中文編碼方式,即gb2312/gbk/gb18080

qstring strunicode = codec->tounicode(gbk2312string);

// 方法b qstring的靜態函式fromlocal8bit()執行的編碼轉換依賴於qtextcodec類的codecforlocale()函式。如果本地作業系統是gb2312,則fromlocal8bit()負責將gb2312轉換為unicode編碼。注意!如果此時檔案編碼與操作編碼不同,則中文還是會顯示亂碼!所以,檔案編碼決定了採用何種編碼轉換為unicode編碼

qstring strunicode = qstring::fromlocal8bit("中文");

ui->label->settext(strunicode);

2. 整體編碼

// gb2312轉unicode 整體編碼

// 方法a

qtextcodec *codec = qtextcodec::codecforlocale();

qtextcodec::setcodecforcstrings(codec); // 通過呼叫該函式,使得qstring在呼叫建構函式時將本地作業系統編碼轉換為unicode編碼。注意!如果此時檔案編碼與作業系統的編碼不同,則中文還是會顯示亂碼!

// 方法b

qtextcodec *codec = qtextcodec::codecforname("gbk");

qtextcodec::setcodecforcstrings(codec);

qstring strunicode = "中文";

從乙個小故事聊聊字元編碼那些事

在編碼界一直流傳著聯通不如移動的乙個故事。請不要誤會,聯通和移動和本篇文章所說的編碼確實沒什麼關係,但請出聯通和移動幫忙做個小實驗,再來仔細說說編碼。在windows系統下,在桌面上右鍵新建乙個記事本檔案,開啟它輸入 聯通 兩個漢字,ctrl s儲存並關閉。雙擊再次開啟它,看到了什麼?奇怪,文字怎麼...

關於字元編碼的那些事

作為程式設計師,在工作或者學習的過程中肯定遇到字元亂碼的現象。可能是在某個檔案的文字內容 現,又或者是在網路傳輸的過程中遇見。而發生這些問題的原因都和今天要說主角字元編碼有關係。由於計算機本身不能表述具體的資訊,因此通過規定好的數字對現實生活中的資訊比如英文 中文進行描述,通過這種方式就可以表述具體...

聊聊fork的那些事

參加了一場面試 學會了乙個知識點 fork之後發生了 什麼 我很正常的做出了回答,對父程序的記憶體進行了複製。fork之後 在早期的unix的系統是通過複製的 為系統分配 記憶體頁 初始化記憶體頁 將父程序的記憶體內容分配到子程序當中 這造成了什麼?這造成了cpu和記憶體的浪費,如果乙個父程序1個g...