編輯器寫C語言輸出中文亂碼問題及解決
編輯器寫C語言輸出中文亂碼
在寫C語言時,有時候需要使用printf輸出中文,如果使用IDE來寫代碼,例如使用VisualStudio,輸出中文沒有問題。
但是當使用編輯器+編譯器的方式寫代碼,在這個環(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.運行:輸入main.exe 運行程序 (注:test.txt和C源文件在同一個文件夾下)
分析原因:
這時候輸出中文異常,但是讀取的內(nèi)容沒有問題。
這里關注兩個:一是為什么"printf("a的值:%s\n", a)"這句代碼中的漢字在輸出時亂碼,二是同樣漢字,讀取的內(nèi)容沒有問題。
第一個問題是因為編碼不一致,也就是文件的編碼和系統(tǒng)終端(也就是cmd)的默認編碼是不一樣的,中文系統(tǒng)里cmd的默認編碼是GBK,而在VSCode中文件的編碼是UTF-8。當這兩個編碼不一樣時,會出現(xiàn)中文亂碼,準確說是異常。
圖:VSCode的文件默認編碼是UTF-8
第二個問題為什么讀取內(nèi)容沒問題呢,這是因為Windows文本文檔的默認編碼是ANSI(在中文系統(tǒng)里即GBK)(ANSI和ASCII的關系:簡單說就是ANSI是對ASCII的擴展,兼容ASCII),cmd默認輸出編碼是ASCII(即GBK),所以讀取了文件內(nèi)容再將內(nèi)容輸出到cmd終端沒有問題。
圖:通過文件-另存為 可以查看到這個文件的編碼方式,默認為ANSI
測試
知道后,可以做個測試,將test文件的編碼改為UTF-8,然后再讀取輸出,如果沒有錯,這時候應該輸出異常。
1.保存為UTF-8
2.運行下程序
和預想結果一樣
拓展
這里使用另一個輕量IDE:Dev-C++
當把main.c用dev打開時,出現(xiàn)亂碼:
這個亂碼和上面終端輸出“a的值”的亂碼一樣
做個測試,使用dev新建文件,復制代碼進去
編譯運行結果:
我們在dev的終端里"a的值"輸出沒有問題,后面的內(nèi)容異常,這是因為前面把test文件改為了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編碼輸出中文是沒有問題的。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C++實現(xiàn)LeetCode(149.共線點個數(shù))
這篇文章主要介紹了C++實現(xiàn)LeetCode(149.共線點個數(shù)),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07優(yōu)先隊列(priority_queue)的C語言實現(xiàn)代碼
本文簡要介紹一種基于數(shù)組二叉堆實現(xiàn)的優(yōu)先隊列,定義的數(shù)據(jù)結構和實現(xiàn)的函數(shù)接口說明如下2013-10-10VS2022連接sqlserver數(shù)據(jù)庫教程
本文主要介紹了VS2022連接sqlserver數(shù)據(jù)庫教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07