tinyxml2 数组_科学网—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下面编译的命令很简单:

@./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,为了与甲方服务器一致,修改成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

第五步:

编写转换函数

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 nn",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(pathMetaData),szgbk);

printf("Encoding changed!nInput IRS Metadata path = %s nn",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;

}

转载本文请联系原作者获取授权,同时请注明本文来自曹彪科学网博客。

链接地址:http://blog.sciencenet.cn/blog-603044-625417.html

上一篇:毕业纪念册上的留言

下一篇:VC6.0静态编译注意事项

你可能感兴趣的:(tinyxml2,数组)