关于源文件用不同的编码方式编写,会导致执行结果不一样的现象及解决方法
如果我們編寫以下程序,并分別另存為ANSI和UTF-8兩種不同的編碼方式保存,放到Linux下編譯并運行如下圖,兩端相同的程序以不同的編碼方式保存編譯后的運行結果不一樣,./ansi采用ANSI編碼方式,會自動采用GBK方式來保存中文漢字“中”(“中”的GBK編碼就是d6 d0,utf-8則是e4 b8 ad),那么我們有沒有什么辦法能夠解決不同編碼方式保存才來的執行結果不同的問題呢
#include <stdio.h>int main(int argc, char **argv) {int i = 0;unsigned char *str="abc中";while (str[i]){printf("%02x ", str[i]);i++;}printf("\n");return 0; }?
怎么解決?編譯程序時,要指定字符集
我們通過man gcc ,并以/charset查找可以知道,我們可以在編譯程序的時候指定編碼方式如下
-finput-charset=charset ?表示源文件的編碼方式, 默認以UTF-8來解析
-fexec-charset=charset ? 表示可執行程序里的字時候以什么編碼方式來表示,默認是UTF-8
?
gcc -finput-charset=GBK -fexec-charset=UTF-8 -o utf-8_2 ansi.c
指定源文件的編碼方式為GBK(GBK兼容ansiic碼的,因為ansiic碼很少,只有200多個)
指定可執行程序里的字時候以UTF-8編碼方式來表示,結果如下圖,我們成功地解決了這個編碼問題。
?
?
如果我們沒有指定,源文件的編碼方式, 默認以UTF-8來解析,可執行程序里的字默認也是UTF-8,那么我們之前編譯第一個程序./ansi的時候,ansi.c的編碼方式是ANSI,而我們默認采用UTF-8為什么沒有報錯呢,這只能說gcc編譯器沒有那么的偉大,自動識別出來(畢竟不是專門做字符的編碼處理的),需要我們手動地指定才能夠得出正確結果。
總結
以上是生活随笔為你收集整理的关于源文件用不同的编码方式编写,会导致执行结果不一样的现象及解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 子宫内膜厚吃黄体酮能脱落干净吗
- 下一篇: 引入宽字符error: converti