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调试程序

相关文章
相关标签/搜索