㈠ win732位下載中文亂碼
win732下載中文亂碼(win7下載文件亂碼)前言初學者在Windows平台上進行C/C 在發語言(中文)程序時,有時會遇到編譯報錯、控制台運行時顯示中文亂碼的問題。
本文描述並分析了此類問題的原因,然後給出了解決方案。
本共享內容目錄如下:
1. 基本概念基本概念(字元集、字元編碼、代碼頁面)GBK、UTF-8)
問題描述(例源碼、編譯報錯、中文亂碼)
原因分析(編碼環節簡介,原因分析)
解決方案(解決方案、編譯錯誤解決方案、中文亂碼解決方案)
結束語
本文將涉及以下基本概念:
1.1 Charset(字元集)Charset(字元集):是系統支持的所有抽象字元的集合。字元是各種文字和符號的總稱,包括國家文字、標點符號、圖形符號、數字等。字元是各種文字和符號的總稱,包括國家文字、標點符號、圖形符號、數字等。常見的字元集包括:ASCII字元集、Unicode字元集等。
計算機要准確處理各種字元集文字,需要編碼字元,使計算機能夠識別和存儲各種文字。
1.2 Character Encoding(字元編碼)Character Encoding(字元編碼)用於為指定集合中某一對象(如電脈沖、比特模式等),以便文本在計算機中存儲和通過通信網路的傳遞。字元編碼是將符號轉換為計算機可接受的數字系統。常見例子:將拉丁字母表編碼成ASCII。
1.3 CodePage(代碼頁)註:術語字元編碼(Character Encoding)、字元映射(Character Map)或者代碼頁(CodePage),同義概念往往是歷史上的,即字元表(repertoire)如何將中間的字元編碼的流(stream of code units)–通常每個字元對應單個碼元。
CodePage(代碼頁)它也被稱為字元編碼的別名內碼表,是特定語言字元集的表。
1.3 CodePage(代碼頁)CodePage(代碼頁)它也被稱為字元編碼的別名
內碼表,是特定語言字元集的表。
:指計算機的BIOS支持的字元集編碼。最具代表性的是"代碼頁437(IBM PC或MS-DOS )"。
Windows(ANSI)代碼頁:微軟定義了一系列支持不同語言字元集的代碼頁支持不同語言字元集的代碼頁。最具代表性的是代碼頁WINDOWS-1252(實現了ISO-8859-1)。註:Windows代碼頁面最初是基礎ANSI草案實現了,草案最終成為ISO 8859-1。這是Windows代碼頁被稱為ANSI的緣由。本文涉及的兩個重要代碼頁面介紹如下:代碼頁936
:代碼頁面對應GBK編碼。既是OEM代碼頁
,也是ANSI代碼頁。代碼頁65001:代碼頁面對應
UTF-8編碼。Windows平台上的GUI程序使用
ANSI代碼頁,使用控制台程序OEM代碼頁(以便向後兼容)。
在Windows系統中的命令行窗口可以通過
chcp命令
也可以通過chcp命令將具體的整數參數(代碼頁數值)帶到當前的代碼頁(如臨時修改為UTF-8對應的65001):C:\> chcp 65001Active code page: 65001
1.4 GBK(漢字內碼擴展規范)GBK(英文全稱:Chinese Internal Code Extension Specification,中文全稱:擴展漢字內碼規范)是對GB2312-80擴展,即代碼頁936擴展(以前代碼頁936和
GB2312-80一模一樣),最早實現Windows 簡體中文版95。GBK總編碼范圍為
0x8140~0xFEFE,首位元組在0x40~0xFE0x81~0xFE
尾位元組在之間
之間,剔除
xx7F
後續的國家標准GB18030技術上兼容GBK。註:微軟Windows安排給GBK代碼頁是936,所以編碼格式WINDOWS-936其實就是GBK。
1.5 UTF-8UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode可變長度字元編碼。它可以使用一到四個位元組
Unicode
編碼字元集中的所有有效編碼點,屬於Unicode
標準的一部分。自2009年以來UTF-8它一直是互聯網上使用最廣泛的編碼方法。2. 問題描述初學者在Windows平台上進行C/C 在發語言(中文)程序編程時,有時會遇到編譯報錯、控制台執行時顯示中文亂碼的問題。
2.0 示例源碼
C語言源代碼文件(功能:中英文信息從控制台顯示。)#include int main(void){printf(" ");printf(" Hello, C語言開發者! ");printf(" ");return 0;}2.1 編譯報錯
第一類問題是:編譯時發現錯誤,錯誤信息如下:
hello.c: In function 'main':hello.c:6:12: error: converting to execution character set: Illegal byte sequenceprintf(" Hello, C語言開發者! ");^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2.2 中文亂碼第二類問題是以通過編譯順利生成,但可執行文件在Windows控制台運行時顯示中文亂碼,如下圖示:控制台顯示中文亂碼1或:
控制台顯示中文亂碼23. 原因分析Windows平台C/C 語言(中文)程序編譯報錯,控制台執行時顯示中文亂碼一般是編碼不一致造成的。3.1 編碼鏈接簡介首先,我們來看看 Windows 一個平台開發運行C/C 語言程序的編碼環節主要涉及哪些?C語言開發全過程涉及編碼環節
鏈接1。保存源代碼時的字元編碼
描述:指保存源代碼文件中編輯器使用的字元編碼。默認編碼:Windows默認情況下,台上Windows本地編碼,即WINDOWS-936代碼頁,也就是GBK編碼。默認編碼:Windows默認情況下,台上Windows本地編碼,即WINDOWS-936代碼頁,也就是GBK編碼。編碼設置:源文件保存代碼可以通過編輯器設置更改,如果保存為
UTF-8編碼
:
-finput-charset=GBK
四、控制台使用的字元編碼描述:顯示控制台使用的代碼。默認:Windows默認使用平台控制台WINDOWS-936代碼頁
(即GBK編碼);Linux默認使用控制台UTF-8編碼。
編碼設置:Windows可通過平台注冊表編輯器指定控制台顯示輸出執行文件的編碼。3.2 原因分析
Windows平台C/C 語言(中文)程序編譯報錯,控制台執行時顯示中文亂碼一般是編碼不一致造成的。原因分析
3.2.1 分析編譯報錯原因從上圖可以清楚地看出,編譯報錯的原因是環節一與環節二由於兩碼不一致(如下)造成的:(一)上圖1與4的組合(源文件保存為UTF-8編碼
,但GCC編譯器設置輸入文件-源文件GBK編碼解析)(2)上圖2與3的組合(源文件保存為GBK編碼
,但GCC編譯器設置輸入文件-源文件UTF-8編碼解析)
3.2.2 中文亂碼原因分析從上圖可以清楚地看出,中文亂碼的原因是環節三與環節四由於兩碼不一致(如下)造成的:(一)上圖5和8組合
(GCC編譯器對輸出執行文件設置的是UTF-8編碼,但Windows控制台是GBK編碼)(二)上圖中的6與7的組合
(GCC編譯器對輸出執行文件設置的是GBK編碼
,但Windows控制台是UTF-8編碼)
4. 解決方法
4.1 解決思路
通過上述原因分析,已經發現了編譯報錯和中文亂碼的問題根源所在:前後環節的編碼不一致造成。
一、在環節一和環節二之間保持兩者編碼的一致性(1和3組合
,或2和4組合)進而解決編譯報錯問題;二、在環節三和環節四之間保持兩者編碼的一致性(5和7組合
,或6和8組合)進而解決中文亂碼問題。
4.2 編譯報錯解決針對編譯報錯的兩種情形(1和4組合、2和3組合)具體解決辦法是:4.2.1 方法一(1和3組合)修改源文件編碼為UTF-8編碼,以跟GCC編譯器對輸入文件-源文件默認UTF-8編碼解析保持一致。修改源文件編碼為UTF-8編碼的具體步驟如下:修改源文件編碼為UTF-8編碼Step1:通過執行Code::Blocks軟體的菜單欄【設置】下的【編輯器】子菜單項,進入「編輯器配置」窗口。Step2:點擊左側【常規設置】按鈕(上圖標號1處),繼續點擊右側的【編碼設置】選項卡(上圖標號2處)Step3:在使用編碼右側的下拉框中選擇【UTF-8】(
上圖標號3處)Step4:選中【
設為默認的編碼方式(忽略C::B的自動檢測)】(上圖標號4處)Step5:點擊右下角的【
確定】按鈕,完成編輯器編碼設置。Step6
:然後將編輯器內的源文件稍加修改重新保存(保險起見,可以重啟code::Blocks軟體以確保源文件編碼生效)。
4.2.2 方法二(2和4組合)修改源文件編碼為GBK編碼,將GCC編譯器對輸入文件-源文件設置為是按GBK編碼解析。一、修改源文件編碼為GBK編碼的具體步驟與上面類似(在下拉框中把UTF-8改為WINDOWS-936即可)。修改源文件編碼為GBK編碼二、修改編譯器對輸入源文件的解析編碼為GBK編碼的具體步驟如下:修改編譯器輸入編碼設置Step1:通過執行Code::Blocks軟體的菜單欄【設置】下的【編譯器】子菜單項,進入「編譯器設置」窗口。Step2:點擊左側【全局編譯器設置
】按鈕(
),繼續點擊右側的【編譯器設置】選項卡(
上圖標號2處)Step3
:再繼續點擊下方的【其他編譯器設置
】選項卡(上圖標號3處)Step4:在下面的文本框中直接輸入-finput-charset=GBK(上圖標號4處)Step5
:點擊右下角的【確定
】按鈕,完成編譯器輸入編碼設置。
經過前面兩種方法的設置,完成編碼一致性後,再次進行編譯,就已經可以成功通過了(如下圖示)。編譯成功但顯示亂碼
但是你會發現程序運行在控制台時顯示中文亂碼了。此時再回想一下:源文件編碼(GBK)+ 編譯器輸入設置編碼(GBK) = 編譯通過。但因為GCC編譯器默認輸出執行文件編碼為UTF-8編碼,同時Windows控制台默認是GBK編碼
,所以此時程序運行在控制台顯示中文亂碼邏輯上是正常的。
4.3 中文亂碼解決針對中文亂碼的兩種情形(5和8組合、6和7組合)具體解決辦法是:4.3.1 解決方法一(6和8組合)設置GCC編譯器對輸出執行文件是GBK編碼,跟Windows控制台默認GBK編碼保持一致。修改編譯器對輸出執行文件編碼為GBK編碼的具體步驟如下:修改編譯器輸出編碼設置Step1:通過執行Code::Blocks軟體的菜單欄【設置】下的【編譯器】子菜單項,進入「編譯器設置」窗口。Step2:點擊左側【全局編譯器設置
】按鈕(
Step3:再繼續點擊下方的【其他編譯器設置
】選項卡(上圖標號3處)Step4
:在下面的文本框中直接輸入-fexec-charset=GBK(上圖標號4處)Step5:點擊右下角的【確定】按鈕,完成編譯器輸出編碼設置。4.3.2 解決方法二(5和7組合)修改Windows控制台編碼為UTF-8編碼,以跟GCC編譯器對輸出執行文件默認UTF-8編碼保持一致。修改Windows控制台編碼為UTF-8編碼的具體步驟如下:Step1:通過快捷鍵Win+R,彈出的【運行】窗口中,執行regedit命令,然後點擊【確定
】按鈕打開「注冊表編輯器」窗口。運行regedit命令Step2:在「注冊表編輯器」窗口中依次點擊【計算機】(下圖標號1)、【HKEY_CURRENT_USER】(下圖標號2
)、【Console】(下圖標號3)進入注冊表編輯器查找
Step3:在右側選中【CodePage】項,然後雙擊彈出「編輯 DWORD(32位)值修改注冊表完成」窗口,依次選擇【
十進制】(
下圖標號1處)、把「數值數據」下的 936 修改為 65001(下圖標號2處)。修改注冊表項Step4:點擊上圖【確定
】按鈕,完成修改(如下圖示)。
Step5
快捷鍵F5】進行刷新生效。
注1:如果要恢復原數值只需重復同樣的步驟,把65001修改為936即可。注2:上面方法面向所有的控制台(如:Windows默認CMD控制台、CodeBlocks控制台、DevCpp控制台、Git CMD控制台等)生效。
注3:如果只需針對特定控制台生效,可以在本步驟基礎上,再往下一層,選中具體控制台(如【DWORD(32位)值】,該數值名稱設為【CodePage】,數值數據設為【65001】(十進制)。然後【C:_Develop_CodeBlocks_cb_console_runner.exe
】),然後通過滑鼠右鍵菜單新建一個【
F5】刷新即可生效。
驗證:經過上面兩種方法的設置,完成編碼一致性後,再次在控制台運行軟體時就已經是正常顯示中英文了(如下圖示):編譯、運行顯示正常註:本文雖是以Code::Blocks集成開發環境為例進行講解,但其原理針對Windows平台上C語言程序運行的其他控制台(如Windows默認CMD控制台、Git CMD控制台等)也是適用的。結束語相信各位 C 語言初學者們閱讀完本文後,應該已經對 Windows 平台C語言(中文)程序在編譯時報錯的原因及解決辦法、在控制台運行時顯示中文亂碼的原因及解決辦法已經有了比較基本的了解掌握,此類問題將不再困擾,接下來就可以愉快地學習其他 C 語言知識了。希望本文能對您有所幫助!喜歡的話就點個贊加關注支持一下哈:)㈡ Qt無法編譯,錯誤報告Error while building/deploying project …… When executing step "Make"
路徑不能有中文