GNU-libiconv编码转换库的使用举例
继GDAL库、PROJ库、HDF5库、TINYXML库之后,手上进行的项目又让我碰到了ICONV库。之前花了2天时间没有搞定,在甲方一直催促下,今天又捡起来搞搞,搞了一天最终搞定了。相关心得记录例如以下:
ICONV库的主要作用是进行各个国家不同编码方式之间的转换。
仅仅要支持的有:Unicode[utf8、utf16等]、中国标准[GBK、GB18030、BIG5、EUC-CN等]、欧洲标准[ASCLL、CP、Mac等]。我这个项目中涉及到的就是utf8与GBK之间的转换。
早期的ICONV库是同一时候公布LINUX和WINDOWS的版本号的,在1.11版本号之后不再对WINDOWS进行支持,眼下最新的版本号为2011年公布的1.14。
第一步:
在linux以下编译的命令非常easy:
@./configure
@make
@make install
三条命令运行完毕之后在/usr/local/include以下会出现三个.h文件。
在/usr/local/lib以下会出现11个文件(.a及其.so)。
第二步:
在编写转换程序之前有必要先看看系统的编码方式是什么。命令为@locale。
LANG=en_US.UTF-8
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX "
LC_MESSAGES="POSIX "
LC_PAPER="POSIX "
LC_NAME="POSIX "
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX "
LC_MEASUREMENT="POSIX "
LC_IDENTIFICATION="POSIX "
LC_ALL="POSIX "
上面的信息显示当前系统的编码方式为UTF8,为了与甲方server一致。改动成GBK。
@vi /etc/profile
在末尾加入2行:
export LC_ALL="zh_CN.GBK"
export LANG="zh_CN.GBK"
@reboot
@locale
LANG=zh_CN.GBK
LC_CTYPE="zh_CN.GBK
LC_NUMERIC="zh_CN.GBK "
LC_TIME="zh_CN.GBK "
LC_COLLATE="zh_CN.GBK
LC_MONETARY="zh_CN.GBK "
LC_MESSAGES="zh_CN.GBK "
LC_PAPER="zh_CN.GBK "
LC_NAME="zh_CN.GBK "
LC_ADDRESS="zh_CN.GBK "
LC_TELEPHONE="zh_CN.GBK "
LC_MEASUREMENT="zh_CN.GBK "
LC_IDENTIFICATION="zh_CN.GBK "
LC_ALL=zh_CN.GBK
上面的信息表明系统的编码方式已经改动成功。
第三步:
设置链接库的环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
第四步:
在cpp文件里包括头文件
#include <iconv.h>
第五步:
编写转换函数
bool ChangeCodeToGBK(char* szInstr,int in,char* szOutstr,int out)
{
iconv_t conveter=iconv_open("GBK","UTF-8");
//iconv_open函数第一个參数为ToEncoding。第二个參数为FromEncoding
memset(szOutstr,0,out);
char **source=&szInstr;
char **dest=&szOutstr;
iconv(conveter,(char **)source,(size_t *)&in,(char **)dest,(size_t *)&out);
iconv_close(conveter);
return 0;
}
bool ChangeCodeToUTF8(char* szInstr,int in,char* szOutstr,int out)
{
iconv_t conveter=iconv_open("UTF-8","GBK");
memset(szOutstr,0,out);
char **source=&szInstr;
char **dest=&szOutstr;
iconv(conveter,(char **)source,(size_t *)&in,(char **)dest,(size_t *)&out);
iconv_close(conveter);
return 0;
}
第六步:
主函数调用示范
const char * pathMetaData = NULL;
//读取UTF8格式的字符串。存入pathMetaData数组中。
printf("Input IRS Metadata path = %s \n\n",pathMetaData);
char strcopy[256];
memset(strcopy,0,256);
char szgbk[256];
memset(szgbk,0,256);
strcpy(strcopy,pathMetaData);
ChangeCodeToGBK(strcopy,strlen(strcopy),szgbk,256);
strcpy(const_cast<char*>(pathMetaData),szgbk);
printf("Encoding changed!\nInput IRS Metadata path = %s \n\n",pathMetaData);
第七步:
加入一个推断函数IsTextUTF8( char *lpstrInputStream, int iLen )
bool IsTextUTF8( char *lpstrInputStream, int iLen )
{
int i;
unsigned long cOctets; // octets to go in this UTF-8 encoded character
unsigned char chr;
bool bAllAscii= true;
cOctets= 0;
for( i=0; i < iLen; i++ )
{
chr= *(lpstrInputStream+i);
if( (chr&0x80) != 0 ) bAllAscii= false;
if( cOctets == 0 )
{
// 7 bit ascii after 7 bit ascii is just fine. Handle start of encoding case.
if( chr >= 0x80 )
{
// count of the leading 1 bits is the number of characters encoded
do
{
chr <<= 1;
cOctets++;
}
while( (chr&0x80) != 0 );
cOctets--; // count includes this character
if( cOctets == 0 ) return false; // must start with 11xxxxxx
}
}
else
{
// non-leading bytes must start as 10xxxxxx
if( (chr&0xC0) != 0x80 )
{
return false;
}
cOctets--; // processed another octet in encoding
}
}
// End of text. Check for consistency.
if( cOctets > 0 ) // anything left over at the end is an error
{
return false;
}
if( bAllAscii ) // Not utf-8 if all ascii. Forces caller to use code pages for conversion
{
return false;
}
return true;
}
GNU-libiconv编码转换库的使用举例的更多相关文章
- libiconv字符集转换库在C#中的使用
<libiconv字符集转换库用法>一文中说到了libiconv能够实现不同字符集的转换. 比方GBK转BIG5等.在项目中由于须要,找到这个库.但是这个库在C#中没有非常好的支持.只是, ...
- PHP字符编码转换库iconv的一个细节
先来看代码 <?php $charset = 'GBK'; $str = '中华人民共和国中华人民共和国中华人民共和国中华人民共和国'; ; $str2 = iconv('UTF-8', $ch ...
- iconv字符编码转换
转自 http://blog.csdn.net/langresser_king/article/details/7459367 iconv(http://www.gnu.org/software/li ...
- [NodeJS] Node.js 编码转换
Node.js 自带的 toString() 方法不支持 gbk,因此中文转换的时候需要加载第三方库,推荐以下两个编码转换库,iconv-lite 和 encoding. iconv, iconv-l ...
- Node.js 编码转换
Node.js自带的toString()方法不支持gbk,因此中文转换的时候需要加载第三方库,推荐以下两个编码转换库,iconv-lite和encoding. iconv, iconv-l ...
- erlang中字符编码转换(转)
转自:http://www.thinksaas.cn/group/topic/244329/ 功能说明: erlang中对各种语言的编码支持不足,此代码是使用erlang驱动了著名的iconv编码库来 ...
- 关于JS的编码转换问题
在进行JS开发过程中,尤其是在开发报表时,报表已集成到Web页面中,通过在页面传递参数至报表中时,会发现有时某些参数值,传递到报表中是显示为问号或乱码等等一系列不能正常显示的情况. 这是由于浏览器和报 ...
- golang编码转换
在网上搜索golang编码转化时,我们经常看到的文章是使用下面一些第三方库: https://github.com/djimenez/iconv-go https://github.com/qiniu ...
- 理解perl的编码转换——utf8以及乱码
工作需要,闲暇之余,仔细研究了一下脚本乱码的问题 1. vim新建的文件 1)在linux命令行 vim命令建立的文件,如果内容中不出现中文,默认是ASCII.那么用notepad++打开的时候,就是 ...
随机推荐
- AjAX 常用参数
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...
- Vue PC端框架
Vue PC端框架 1. Element 中文文档:http://element-cn.eleme.io/#/zh-CN github地址:https://github.com/ElemeFE/ele ...
- SpringBoot中打包设置,将配置文件打包在外部
一.每次用maven的打包工具打包的时候 总是将配置文件一起打包进jar中!配置文件有点小修改就要重新打包很麻烦!!!!为了解决这一麻烦!找 了很多方法,下面的配置已经实现可用 我的项目目录结构如下 ...
- HDU 4828 (卡特兰数+逆元)
HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0,后n个人标为1.然后去全排列,全排列的数列,假设每一个1的前面相应的0大于等于1,那么就是满足的序列.假设把0看成入栈,1看 ...
- 号外:Spark 1.3.0公布了,快来一起飞!
Spark 1.3.0 Release Note Spark 1.3.0在上周五正式公布.真是千呼万唤始出来.本次公布最大的惊喜就是DataFrame.另外一个值得关注的是Spark SQL从Alph ...
- BZOJ 2301 莫比乌斯函数+分块
思路: 同BZOJ1101 就是加个容斥 - http://blog.csdn.net/qq_31785871/article/details/54340241 //By SiriusRen #inc ...
- Windows上快速编译caffe CPU版本
windows上快速安装配置Caffe的 cpu_only环境. 一:安装环境: 1.windows10: 2.Visual Studio2013: 3.Caffe版本:http://github.c ...
- c# 02-18 值类型 引用类型 字符串的不可变性 字符串的处理方法
1值类型 直接把值存在栈中 栈的特点是后进先出 int double decimal char struct enum bool 2 引用类型 把值存在堆中,把地址存在栈中: string 自定义的类 ...
- PC比价软件
方法:从百度中搜索比较软件排行,并且根据将搜索时间缩小在一年内.统计前面一页结果网站中的比价软件. 名称 备注 统计 淘淘搜购物助手 淘宝购物比价神器 1 省省比价软件 主流网购商城进行横向比较的智能 ...
- POJ 2386 Lake Counting【BFS】
题意:给出一个矩形,问有多少块连通的W 当找到W的时候,进行广搜,然后将搜过的W变成点,直到不能再搜,进行下一次广搜,最后搜的次数即为水塘的个数 看的PPT里面讲的是种子填充法. 种子填充算法: 从多 ...