zoukankan      html  css  js  c++  java
  • 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的封装。

    这个问题涉及到一个字符,他在源代码时是以什么形式(或者说编码格式)存的,在编译好的二进制文件中是以什么形式存的,以及最后输出的时候输出的是什么编码格式。

    如果是普通字符串,那么它在这三者中表现形式是一致的。而宽字符串,却有可能不同。

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

  • 相关阅读:
    UE4美术之数学基础知识(一)
    如何用Unity制作逼真的自然场景?
    git拉取和上传项目代码
    Chaosblade-故障使用工具
    如何对数据库做优化
    分布式和集群的概念
    token、cookie、session的区别
    Json中的json.tojsonString()方法
    JSON的put方法
    fastjson中的相关方法
  • 原文地址:https://www.cnblogs.com/abcat/p/3388615.html
Copyright © 2011-2022 走看看