Windows下c 字元編碼 一

2021-08-30 22:07:39 字數 2041 閱讀 3525

在談c++之前,不得不先來說說各種字元編碼。我們知道最早的英文本元採用ascii,因為英文本元很少,因此乙個char就夠用了。但是由於處理其他語言的需求,8位的char顯然不夠用,這就要求更多位數的編碼。

在中國,我們的國標是gbk,(準確的說經歷了gb2312->gbk->gb18030的發展過程),我們常說的漢字佔兩個位元組也就是**於此。

微軟作為乙個世界大廠,採用什麼編碼呢?微軟雖然在語言支援上很上心,不過編碼卻很混亂,微軟的預設編碼是ansi,這是個什麼東西呢?這其實就是大雜燴,英文還是ascii,中文是gbk,港澳台使用它們那邊的big5……等等。這些編碼並不統一,是非常沒有相容性的。其實ansi不是一種編碼,不過我就這麼簡單的說了,關於ansi具體是什麼,你可以看看這篇文章:

由於我們主要還是說中文問題,以下提到ansi的地方,你應該立即聯想到,中文是採用gbk編碼的。其中,值得一提的是gbk編碼是雙位元組的,這是中文字元佔兩個位元組說法的由來。

由於各地編碼的不統一,於是產生了unicode,unicode其實是乙個標準,而不是一種編碼。unicode現有兩套標準,ucs2和ucs4,一開始認為雙位元組夠用,就是ucs2,後來發現雙位元組不夠用,那就擴充套件到4位元組吧,於是就有了ucs4。unicode現在主要有三種實現方式。即utf-8,utf-16,和utf-32。

utf-16

先講utf-16,這是採用雙位元組表示的,遵從ucs2。在儲存時,按兩個位元組的排布順序,可以分為utf-16le(little endian,小端位元組序)和utf-16be(big endian,大端位元組序),微軟所說的unicode預設就是 utf-16le。注意微軟後來也搞了unicode,但是微軟自己鼓吹的unicode只是其中一種實現方式而已。

utf-16後來發現雙位元組不夠用,於是增加了採用一對雙位元組來表示乙個字元,這其中也包括一些生僻漢字,之後我們將會提到具體例子。所以其實標準的utf-16也是變字長的編碼,很多人認為utf-16編碼是定長編碼,這其實是錯誤的。此外,utf-16不等價於ucs2,可以認為ucs2是定長編碼(雙位元組),而utf-16是ucs2的擴充套件。

utf-32

再說utf-32,既然雙位元組不夠用,那就用四位元組吧,於是就有了ucs4標準和utf-32實現方式。utf-32所有的字元都採用4個位元組,這才是真正的定長編碼。utf-32等價於ucs4,utf-32也存在儲存順序的問題。由於utf-32基本沒人用,就不詳細展開。

不過,我們知道**原始檔還是ascii字元主導。而在網頁上,大量的標記都是ascii字元。utf-32要用4位元組,utf-16也要2位元組,都比最初的ascii長,這顯然是非常浪費空間的,更何況網路傳輸資料越少越好,因此utf-16和utf-32都是不合用的。

utf-8

utf-8解決了這個問題,utf-8是完全的變長編碼,相容ascii,也就是ascii編碼部分保留,其他的字元根據情況有2,3,4位元組。其中特別值得注意的是漢字一般是三個位元組,也有四個位元組的生僻字情況。(如果你擁護utf-8的話,請不要在說漢字佔2位元組這樣的傻話了。)

utf-8是unix/linux系統的預設編碼,在這些系統上使用charstring,無論輸入輸出都是使用utf-8,因此一般不必擔心編碼問題。在這些系統上,string = "你好世界"size()是12,也就是乙個字元三個位元組,是沒有任何問題的。你編輯c++源**基本不必擔心編碼問題。

但是在windows下就很複雜了。windows自帶notepad是預設ansi編碼的。notepad++和vs code是預設utf-8編碼,未經配置的gvim以及visual studio預設也是ansi。關於c++源**寫中文的注意事項,將在之後的文章中詳細說明。

現在我們來總結一下編碼我們提到的編碼知識:

現在我們來討論c++的字元編碼問題。

在windows下,如果你不得不在原始檔寫中文,而且又不想看我之後幾篇又臭又長的詳解,你可以使用qt專有的qstring,或者使用visual studio來寫**。前者的的預設編碼是utf-16,如果不用生僻字,甚至可以按照定長編碼的方式處理字元。後者是依靠微軟這個ide強大的功能,可以處理各種編碼的原始檔。

Windows下Python字串編碼問題

python語言實際上有三種字串,通常意義的字串 str unicode字串 unicode 和抽象類basestring,其中basestring不可例項化。在windows系統下的cpython直譯器輸入 st1 中文 st1 xd6 xd0 xce xc4 type st1 str st2 s...

Windows下的字元編碼轉換的兩個C 輔助類

字串在很多程式語言中都比較特殊,特別在c 中,處理還比較複雜。在處理編碼轉換時,往往伴隨記憶體的分配和 這裡提供兩個類,採用raii原則,使用資源管理物件來管理記憶體的分配和釋放。用windows api實現的轉換類標頭檔案 oliver chen ifndef codeconvert win h ...

c 字元編碼

一 ascii碼 我們知道,在計算機內部,所有的資訊最終都表示為乙個二進位制的字串。每乙個二進位制位 bit 有0和1兩種狀態,因此八個二進位制位就可以組合出256種狀態,這被稱為乙個位元組 byte 也就是說,乙個位元組一共可以用來表示256種不同的狀態,每乙個狀態對應乙個符號,就是256個符號,...