C 開發時字元編碼的選擇

2022-07-21 04:15:13 字數 2864 閱讀 3076

最近看了很多有關字元編碼的討論帖子, 自己也做了很多嘗試, 針對linux和windows上字元編碼的選擇做了個簡單整理, 在此做個記錄

首先是基礎編碼知識, 下面我列出的4個編碼方式或字符集是我們應該了解的

1. ansi

2. unicode

3. utf8

4. gb2312

這裡因為個人專業水平有限, 為了避免錯誤的解釋, 不對這些概念做詳細解釋, 而是貼出一些我查詢到的有用的資料

unicode 和 utf-8 有什麼區別 ----

簡體漢字編碼方案(gb2312、gbk等)以及全形、半形、cjk ----

ansi編碼與**頁 ----

接下來是我自己的驗證和嘗試的過程以及自己的知識總結

先貼出來我在windows和linux環境下的測試**, 編譯器我分別用linux gcc, msvc v100 和 msvc v141做了測試

1

#ifdef _win32

2#if _msc_ver >= 1600

3#pragma execution_character_set("utf-8")

4#endif

5#endif

67 #include 8 #include 910

intmain()

1124 printf("\n"

);25

26 printf("

unicode :");

27for (size_t idx = 0; idx < testunicode.length(); ++idx)

2831 printf("\n"

);32

33return0;

34 }

下面貼出不同平台不同編碼方式下程式的輸出結果

1.windows環境下, 源**編碼為ansi(本地gb2312)

2.windows環境下, 源**編碼為utf8, 不使用execution_character_set巨集

3.windows環境下, 源**編碼為帶bom的utf8, 不使用execution_character_set巨集

4.windows環境下, 源**編碼為utf8, 使用execution_character_set巨集

5.windows環境下, 源**編碼為帶bom的utf8, 使用execution_character_set巨集

6. ubuntu linux環境下, 源**編碼為帶bom的utf8, 使用預設編碼方式編譯(這裡我指定的編碼方式即預設編碼)

7. ubuntu linux環境下, 源**編碼在utf8和gbk之間變換, 指定不同編碼輸出

msvc v100和msvc v141(對應vs2010和vs2017)的結果相同, 上方windows平台執行截圖均為vs2017編譯執行結果

對上述結果進行總結

windows環境下, 原始檔編碼為不帶bom的utf8時, 由於編譯器沒能正常識別檔案編碼, string的內容被儲存為檔案的原本內容(utf8), wstring儲存的結果均是寬字元字串, 而非unicode字符集

windows環境下, 原始檔編碼為帶bom的utf8或ansi時, 編譯器能夠正常識別檔案編碼(或者直接用本地編碼解析), string內容被儲存為gb2312字串, wstring內容均為unicode字符集

上面兩種情況, 僅當原始檔編碼為帶bom的utf8且程式使用execution_character_set巨集指明utf8時, string內容才會被存為utf8格式, unicode不受影響內容正常

linux環境下在檔案輸入編碼格式正確的情況下, 不管怎麼搞內容都一致, 且gcc編譯器可以相容帶bom的utf8原始檔

綜上, 總結我個人的看法建議 :

純windows平台開發, 源**使用ansi, 字元型別選擇wchar_t, 杜絕char和string, 並且避免使用posix, 使用msvc編譯器一定要在visual studio中選擇使用unicode字符集(影響_unicode和unicode兩個巨集宣告, 使用多位元組則會宣告巨集_mbcs)

跨平台, 類unix佔大頭則源**使用utf8, windows佔大頭則源**使用utf8 with bom並且選擇不受影響的編譯器, 字元型別選擇char, 在呼叫api和io時根據需要進行轉換

重要的一點, 盡可能避免在源**中使用ascii碼以外的任何字元(學好english是關鍵吶)

最後是我查閱和借鑑的資料,帖子,博文:

截止到 2017 年,c++ 對於 unicode 支援情況如何 ----

目前(2020 年)開發windows程式,用unicode還是多位元組更實際 ----

[c/c++] 各種c/c++編譯器對utf-8原始碼檔案的相容性測試(vc、gcc、bcb)----

c 字元編碼

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

字元編碼 C

編碼是乙個將一組 unicode 字元轉換為乙個位元組序列的過程。而解碼是將乙個編碼位元組序列轉換為一組 unicode 字元的過程。codetest using system using system.text namespace convertexample unicodestring cons...

分類時為什麼都選擇one hot編碼

這裡可以做乙個思考啊,分類時,一般都會選擇把類別用one hot進行編碼,比如共有5個類,那麼就有5個編碼 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 這是為什麼呢?為什麼不直接用1,2,3,4,5來表示5個類別呢?個人覺得,乙個很重要的原因在...