編輯器寫C語言輸出中文亂碼問題及解決
編輯器寫C語言輸出中文亂碼
在寫C語言時,有時候需要使用printf輸出中文,如果使用IDE來寫代碼,例如使用VisualStudio,輸出中文沒有問題。
但是當(dāng)使用編輯器+編譯器的方式寫代碼,在這個環(huán)境下輸出中文可能會遇到中文輸出亂碼。
環(huán)境
- 編輯器:VSCode
- 編譯器:Mingw-w64
C語言代碼:
#include <stdio.h> int main() { char a[2048]; FILE *fp; if ((fp = fopen("test.txt", "r+")) == NULL) { printf("無法打開\n"); return 0; } fscanf(fp, "%s", &a); printf("a的值:%s\n", a); fclose(fp); return 0; }
代碼說明:上述代碼的主要作用是讀取文件的內(nèi)容,并將讀取內(nèi)容輸出在屏幕上
文件內(nèi)容:
說明:test.txt 文件是通過右鍵新建文本文檔建立的。
過程
1.編譯:使用gcc main.c -o main,生成可執(zhí)行文件main.exe
2.運(yùn)行:輸入main.exe 運(yùn)行程序 (注:test.txt和C源文件在同一個文件夾下)
分析原因:
這時候輸出中文異常,但是讀取的內(nèi)容沒有問題。
這里關(guān)注兩個:一是為什么"printf("a的值:%s\n", a)"這句代碼中的漢字在輸出時亂碼,二是同樣漢字,讀取的內(nèi)容沒有問題。
第一個問題是因?yàn)榫幋a不一致,也就是文件的編碼和系統(tǒng)終端(也就是cmd)的默認(rèn)編碼是不一樣的,中文系統(tǒng)里cmd的默認(rèn)編碼是GBK,而在VSCode中文件的編碼是UTF-8。當(dāng)這兩個編碼不一樣時,會出現(xiàn)中文亂碼,準(zhǔn)確說是異常。
圖:VSCode的文件默認(rèn)編碼是UTF-8
第二個問題為什么讀取內(nèi)容沒問題呢,這是因?yàn)閃indows文本文檔的默認(rèn)編碼是ANSI(在中文系統(tǒng)里即GBK)(ANSI和ASCII的關(guān)系:簡單說就是ANSI是對ASCII的擴(kuò)展,兼容ASCII),cmd默認(rèn)輸出編碼是ASCII(即GBK),所以讀取了文件內(nèi)容再將內(nèi)容輸出到cmd終端沒有問題。
圖:通過文件-另存為 可以查看到這個文件的編碼方式,默認(rèn)為ANSI
測試
知道后,可以做個測試,將test文件的編碼改為UTF-8,然后再讀取輸出,如果沒有錯,這時候應(yīng)該輸出異常。
1.保存為UTF-8
2.運(yùn)行下程序
和預(yù)想結(jié)果一樣
拓展
這里使用另一個輕量IDE:Dev-C++
當(dāng)把main.c用dev打開時,出現(xiàn)亂碼:
這個亂碼和上面終端輸出“a的值”的亂碼一樣
做個測試,使用dev新建文件,復(fù)制代碼進(jìn)去
編譯運(yùn)行結(jié)果:
我們在dev的終端里"a的值"輸出沒有問題,后面的內(nèi)容異常,這是因?yàn)榍懊姘裻est文件改為了UTF-8。
這里就要問一個問題dev的代碼文件難道和cmd的編碼格式一樣?
可以使用notepad++查看文件編碼:
這個demo.cpp是在dev里創(chuàng)建,編碼是GB2312
前面用dev打開VSCode創(chuàng)建的main.c出現(xiàn)亂碼,說明dev是以GB2312的編碼方式打開文件的,也是以GB2312保存文件的,而GB2312編碼在cmd里以GBK編碼輸出中文是沒有問題的。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(149.共線點(diǎn)個數(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(149.共線點(diǎn)個數(shù)),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07優(yōu)先隊(duì)列(priority_queue)的C語言實(shí)現(xiàn)代碼
本文簡要介紹一種基于數(shù)組二叉堆實(shí)現(xiàn)的優(yōu)先隊(duì)列,定義的數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)的函數(shù)接口說明如下2013-10-10VS2022連接sqlserver數(shù)據(jù)庫教程
本文主要介紹了VS2022連接sqlserver數(shù)據(jù)庫教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Matlab處理圖像后實(shí)現(xiàn)簡單的人臉檢測
本文主要介紹一下如何使用matlab進(jìn)行圖像處理后實(shí)現(xiàn)人臉檢測,感興趣的可以了解一下2021-11-11C語言鏈表實(shí)現(xiàn)商品庫存管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言鏈表實(shí)現(xiàn)商品庫存管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02