1、编码检测转换工具

UI相关使用QT完成。

2、封装编码转换模块

打开未知编码字符的文件,转换成指定编码的字符的文件。

(用于测试的各种编码的文件在 源文件中的build文件夹中的test文件夹中)

编码检测使用chardet,相关操作封装类GetCoderName中:

class GetCoderName

{

public:

         GetCoderName();

         ~GetCoderName();

    static        const char * getEncodeNameFromFile(const char *path); //打开指定文件检测

    static        const char * getEncodeNameFromStr( char const *str); //对指定字符串检测

private:

};

编码转换使用iconv,相关操作封装在CodeConverter类中:

class CodeConverter

{

private:

    iconv_t cd;

public:

    CodeConverter(const char *from_charset,const char *to_charset);

    ~CodeConverter();

 

    // 转换输出

    int convert(char *inbuf,int inlen,char *outbuf,int outlen);

};

对编码的支持情况:

         目前我们使用比较多的编码有3类:

 

         1. Unicode字符集。Unicode用一些基本的保留字符制定了三套编码方式,分别是UTF-8,UTF-16(默认)和UTF-32UTF是通用转换字符集(unicode Transformation Format),这是一种中间格式的字符集,目前存在的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16, UTF-32

         2.中文字符集。中文字符集有GB2312GBKGB18030BIG5等几种。GB2312是国标码,GBK GB2312的扩展 ,除了兼容GB2312,它还能显示繁体中文,还有日文的假名,BIG5是香港*地区使用的繁体中文大五码。

 

         3.其他字符集。ASCIIISO  Latin-1,各种英文字符集 及其 各种国家的语言的字符集。

 

uchardet不支持检测utf7ascii等字母语言的编码字符集,不过对中文字符集的支持很好。

Iconv转编码支持1000多种字符集,对中文支持也很好。存在的主要问题是字符集本身之间的兼容性,有些字符集之间从理论上是不可相互转化的,这个问题是比较难解决的。

支持情况如下表:

字符编码

位数

能否检测

能否转换

说明

 

UTF-7

7

X

7未可变长度字符编码方式

 

UTF-8

8

Unicode的一种8位变长字符编码

 

UTF-16

16

X

Unicode16位(默认)编码方式

 

UTF-32

32

未测试

未测试

Unicode32位编码方式

 

Unicode

16

Unicode默认使用UTF-16编码

 

GB2312

16

大陆简体中文标准1980年发布

 

GBK

16

GB2312的扩展, 能显示繁体中文

 

GB18030

 

GBK的扩展,有8位、16位和32位三种

 

BIG5

16

繁体中文大五码

 

ASCII

7

未测试

未测试

 

 

 

附:【Unicode(UTF-8, UTF-16)令人混淆的概念】

Unicode的最初目标,是用116位的编码来为超过65000个字符提供映射。其实Unicode涉及到两个步骤,首先是定义一个规范,给所有的字符指定一个唯一对应的数字,这完全是数学问题,可以跟计算机没任何关系.第二步才是怎么把字符对应的数字保存在计算机中,这才涉及到实际在计算机中占多少字节空间。

     所以我们也可以这样理解,Unicode是用065535之间的数字来表示所有字符.其中0127128个数字表示的字符仍然跟ASCII完全一样.65536216次方.这是第一步. 但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题(implantation head-ache's),尤其在那些基于网络的应用中。因此,第二步就是怎么把065535这些数字转化成01串保存到计算机中.这肯定就有不同的保存方式了.于是出现了UTF(unicode transformation format),UTF-8,UTF-16.

utf-8很难解决字库问题.通用字库就是一个大杂烩.就是什么都可以显示,通用性好,但是字体可能会有些不让人觉得舒服。

UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节 (2字节) 储存,但UTF-16却无法兼容于ASCII编码。

 

附:【ANSI编码】

不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。ANSI编码表示英文字符时用一个字节,表示中文用两个字节,而unicode不管表示英文字符还是中文都是用两个字节来表示。

 

字符串检测