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-32。UTF是通用转换字符集(unicode Transformation Format),这是一种中间格式的字符集,目前存在的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16, UTF-32。
2.中文字符集。中文字符集有GB2312、GBK、GB18030、BIG5等几种。GB2312是国标码,GBK 是 GB2312的扩展 ,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名,BIG5是香港*地区使用的繁体中文大五码。
3.其他字符集。ASCII、ISO Latin-1,各种英文字符集 及其 各种国家的语言的字符集。
uchardet不支持检测utf7、ascii等字母语言的编码字符集,不过对中文字符集的支持很好。
Iconv转编码支持1000多种字符集,对中文支持也很好。存在的主要问题是字符集本身之间的兼容性,有些字符集之间从理论上是不可相互转化的,这个问题是比较难解决的。
支持情况如下表:
字符编码
|
位数 |
能否检测
|
能否转换
|
说明
|
|
UTF-7 |
7 |
X |
√ |
7未可变长度字符编码方式 |
|
UTF-8 |
8 |
√
|
√
|
Unicode的一种8位变长字符编码
|
|
UTF-16 |
16 |
√
|
X |
Unicode的16位(默认)编码方式 |
|
UTF-32 |
32 |
未测试 |
未测试 |
Unicode的32位编码方式 |
|
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的最初目标,是用1个16位的编码来为超过65000个字符提供映射。其实Unicode涉及到两个步骤,首先是定义一个规范,给所有的字符指定一个唯一对应的数字,这完全是数学问题,可以跟计算机没任何关系.第二步才是怎么把字符对应的数字保存在计算机中,这才涉及到实际在计算机中占多少字节空间。
所以我们也可以这样理解,Unicode是用0至65535之间的数字来表示所有字符.其中0至127这128个数字表示的字符仍然跟ASCII完全一样.65536是2的16次方.这是第一步. 但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题(implantation head-ache's),尤其在那些基于网络的应用中。因此,第二步就是怎么把0至65535这些数字转化成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不管表示英文字符还是中文都是用两个字节来表示。
转载于:https://blog.51cto.com/littlemeng/1182955