关于编码转换

一、安装

去 http://www.gnu.org/software/libiconv/ 上面下载 iconv

然后按照网页上的说明安装就行,注意一定要用那个--prefix=/usr/local的参数,这样才能保证使用刚安装的这个iconv.h,而不是系统自带的

安装完了还要弄个文件链接:ln -sf /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2

否则使用iconv命令时会提示说没有共享链接库 libiconv.so.2

二、编程注意

注意编译的时候要加命令 -liconv,如果用IDE要到IDE设置里面加上

汗,今天(2011年10月27日),用Ubuntu11.10 64位编写程序,发现加入-liconv 竟然还是 undefined reference to libiconv_open

我就受不了了,搞了一整天,发现实因为NetBeans把 -liconv 这个参数加到了 g++ 紧随其后,而我自己写g++编译命令时把-liconv写在最后面竟然能够编译通过!

无奈,最后只能在项目配置,链接器里面附加一个库了,在链接器里加上 /usr/local/lib/libiconv.so就行了

另外一种弄法:

选择 项目配置->定制->链接器->库,然后选择“添加库”,直接填写 iconv,-l 这个参数是自动加的

三、Linux编码知识

在Linux上wchar_t一般以UCS-4标准

UCS-4-INTERNAL ,UCS-2-INTERNAL  会根据本机的存储方式(大端、小端)进行处理。

还有UCS-2LE和UCS-2BE 分别代表小端和大端模式。

Unicode(UCS) 有两套编码集,UCS-2 和 UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节。

Windows 的内部其实是用的 UCS-2 标准,并用 UTF-16 来实现。而非 Windows 系统大多采用了 UTF-8 实现。

在windows上wchar_t是2个字节表示,而在Linux上wchar_t是4个字节表示的。这样写跨平台的程序时,就会不统一。

UTF编码简介:

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制) UTF-8 字节流(二进制) 

0000 - 007F 0xxxxxxx 

0080 - 07FF 110xxxxx 10xxxxxx 

0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx 

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

总结一下:

Windows里的wchar_t,也就是所谓的unicode的叫法,其实是UCS-2,也就是UTF-16,这种编码“A”的话是两字节, 00 38

而ASCII  GB2312  GBK  GB18030是一样东西,里面的“A”就只有一个字节 38,而中文有两个字节,高字节的最高位是1,低字节最高位有可能不是1

UTF-8就是3字节

而UCS-4是4字节,是linux里面的wchar_t

原文地址:https://www.cnblogs.com/xlhblog/p/2216683.html