最近看了很多有關字元編碼的討論帖子, 自己也做了很多嘗試, 針對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個類別呢?個人覺得,乙個很重要的原因在...