Linux下C語言開發的一點記錄

明明不是程序員,但是還老是關心一些跟本身無關的東西。html

一、常見庫linux

  Linux下進行純C語言進行開發經常使用的庫有:GNU C Library(glibc),包括標準庫(ANSI C99)及Posix等標準庫的實現,是編程進行的必需保證;GNULib(The GNU Protability library),提供了跨平臺的常見庫支持,包括ANSI C,Posix的實現,以及一些常見功能的擴展,能夠在MinGW、Mac OS、glibc(Linux)下使用,其中Linux下coreutils的實現就用到了GNUlib;glib是GTK+的一部分,也能夠單獨使用,提供了常見算法、數據結構、IO等功能的實現和封裝。程序員

二、字符編碼算法

  編程中常常遇到編碼的問題,世界的語言多種多樣,想要統一進行表示太過困難了,因而不一樣時期出現不一樣的解決方法。shell

  在Windows下經常使用的Unicode編碼爲cp936(也是GBK),在Linux下則爲UTF-8(具體一點說是:zh_CN.UTF-8)。編程

  在C語言進行編碼時,可使用char[]直接指向一箇中文字符串而且利用printf函數正確輸出,可是此時的輸出正確與否取決於console的編碼。若是c源程序的編碼和console編碼同樣,則輸出正確。這是由於printf直接輸出了字符串的字節碼(utf-8或gbk)並被console正確解釋。可是此時使用len取得的不是字符串裏中文的長度,而是中文編碼的長度。數據結構

  若是要正確處理中文字符串,則須要使用寬字符串。只使用標準庫的話,須要使用<string.h>,<wchar.h>,<locale.h>。函數

  

/*這是一個使用utf-8編碼保存的文件,用來解釋本身對編碼的疑惑*/
#include<stdio.h>
#include<wchar.h>
#include<string.h>
#include<locale.h>
int main(int argc, char *argv[])
{
	setlocale(LC_CTYPE,"");
	wchar_t myUnistring[]=L"中文字符串嘛";
	wprintf(L"%ls\n",myUnistring);
	return 0;
}

  首先使用setlocale設定本地編碼,而後使用wprintf輸出。post

  開始時怎麼也沒法獲得正確輸出,後來查資料才發現,wprintf不能和printf一塊兒使用,不然沒法獲得正確輸出。編碼

  然則,在使用man查看wprintf用法時,發現Linux下不推薦使用這種方法,編譯後的程序在不一樣平臺運行仍是可能獲得亂碼輸出,推薦使用gettext方法。

  另外還可使用ICU庫(IBM開發)或者使用glib對gettext的封裝。

這個問題涉及到一個字符,他在源代碼時是以什麼形式(或者說編碼格式)存的,在編譯好的二進制文件中是以什麼形式存的,以及最後輸出的時候輸出的是什麼編碼格式。

若是是普通字符串,那麼它在這三者中表現形式是一致的。而寬字符串,卻有可能不一樣。

以linux爲例,由於linux下一般使用的字符編碼都是utf8,因此源碼也是以utf8保存的,對於普通字符串,在編譯器編譯的過程當中,什麼也不作,原樣將這個編碼放到二進制文件中。而後printf輸出的時候,也是原樣輸出。若是接收輸出的那個程序(也許是一個shell)支持utf8,那麼固然就能夠正常顯示出來了。若是不支持,就會錯亂。

而對於寬字符來講,還以linux爲例。源碼中依然是utf8,但編譯器在編譯過程當中,會把字符的編碼轉換成unicode保存在二進制文件中。而輸出的形式,取決於你的locale設定了。若是shell支持的是utf8,但你設定的locale是gbk,printf的時候程序就會把unicode轉成gbk編碼輸出,而這邊shell卻當成utf8編碼解釋,最後固然就亂碼了。
 
 

  


參考:

[1]在Linux C編程中使用Unicode和UTF-8

[2]淺談C中的wprintf和寬字符顯示

[3]wprintf不能在linux下輸出的問題

[4]用GDB調試程序

相關文章
相關標籤/搜索