Linux下C语言开发的一点记录
明明不是程序员,可是还总是关心一些跟自己无关的东西。
1、常见库
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等功能的实现和封装。
2、字符编码
编程中经常遇到编码的问题,世界的语言多种多样,想要统一进行表示太过困难了,于是不同时期出现不同的解决方法。
在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输出。
开始时怎么也无法得到正确输出,后来查资料才发现,wprintf不能和printf一起使用,否则无法得到正确输出。
然则,在使用man查看wprintf用法时,发现Linux下不推荐使用这种方法,编译后的程序在不同平台运行还是可能得到乱码输出,推荐使用gettext方法。
另外还可以使用ICU库(IBM开发)或者使用glib对gettext的封装。
|
参考:
[4]用GDB调试程序