C++用iconv进行页面字符转换

摘要:
此时,iconv成为一个非常方便的工具。iconv命令可以将一个已知字符集文件转换为另一个已知的字符集文件。作为一个应用程序,Iconv使用命令行界面,允许您将特定编码的文件转换为另一种编码。Iconv公开了基于GPL的源代码,是GNU项目的一部分。iconv函数需要给出两个间接缓冲区指针和剩余字节数,以执行实际转换。此函数需要更新所有相关信息,因此向iconv传递不可重写指针是错误的。
在对HTML页面进行爬取时,总会遇到一些不同的编码,而我们通常都不会一一对这些编码进行处理,而是集体转换成相同的编码,也易于装入数据库。此时,iconv便成为一个很方便的工具。

iconv 头文件"iconv.h"。iconv命令可以将一种已知的字符集文件转换成另一种已知的字符集文件。 它的作用是在多种国际编码格式之间进行文本内码的转换。 linux下的函数原型 size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); iconv是一个计算机程序以及一套应用程序编程接口的名称。 作为应用程序的iconv采用命令行界面,允许将某种特定编码的文件转换为另一种编码。 iconv基于GPL公开源代码,是GNU项目的一部分。在各种UNIX操作系统下均可使用,而在Windows系统,需要特殊的环境如cygwin或者GnuWin32等软件平台下方可使用。现在在SourceForge上也有运行于Windows系统的,需要同时安装gettext程序。 目前版本为2.3.26,支持的内码包括:Unicode相关编码,如UTF-8、UTF-16等等,各国采用的ANSI编码,其中包括GB2312、BIG5等中文编码方式。 主要内容 作为编程接口的iconv包括3个函数: iconv_open函数用于初始化用于转换的内部缓冲区,指明需要从何种编码方式转换到哪一种。 iconv函数进行实际的转换,需要给出两个间接缓冲区指针和剩余字节数指针。该函数需要更新所有相关信息,因此将不可改写的指针传递给iconv是错误的。 iconv_close函数释放iconv_open函数的缓冲区。


Linux iconv命令是用来转换文件的编码方式,比如可以将UTF8编码的转换成GB18030的编码,反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C函数,可以用来在C/C++程序中很方便的转换字符编码,这在抓取网页的程序中很有用处,而iconv命令在调试此类程序时用得着。 用法: iconv[选项...][文件...] 选项: 输入/输出格式规范: -f,--from-code=NAME始文本编码-t,--to-code=NAME输出编码 信息: -l,--list列举所有已知的字符集 输出控制: -c从输出中忽略无效的字符-o,--output=FILE输出文件-s,--silentsuppresswarnings--verbose打印进度信息-?,--help给出该系统求助列表--usage给出简要的用法信息-V,--version打印程序版本号示例: 列出支持的字符编码[1] [root@new55~]#iconv-lThefollowinglistcontainallthecodedcharactersetsknown.ThisdoesnotnecessarilymeanthatallcombinationsofthesenamescanbeusedfortheFROMandTOcommandlineparameters.Onecodedcharactersetcanbelistedwithseveraldifferentnames(aliases).所有已知字符集 437,500,500V1,850,851,852,855,856,857,860,861,862,863,864,865,866,866NAV,869,874,904,1026,1046,1047,8859_1,8859_2,8859_3,8859_4,8859_5,8859_6,8859_7,8859_8,8859_9,10646-1:1993,10646-1:1993/UCS4,ANSI_X3.4-1968,ANSI_X3.4-1986,ANSI_X3.4,ANSI_X3.110-1983,ANSI_X3.110,ARABIC,ARABIC7,ARMSCII-8,ASCII,ASMO-708,ASMO_449,BALTIC,BIG-5,BIG-FIVE,BIG5-HKSCS,BIG5,BIG5HKSCS,BIGFIVE,BS_4730,CA,CN-BIG5,CN-GB,CN,CP-AR,CP-GR,CP-HU,CP037,CP038,CP273,CP274,CP275,CP278,CP280,CP281,CP282,CP284,CP285,CP290,CP297,CP367,CP420,CP423,CP424,CP437,CP500,CP737,CP775,CP813,CP819,CP850,CP851,CP852,CP855,CP856,CP857,CP860,CP861,CP862,CP863,CP864,CP865,CP866,CP866NAV,CP868,CP869,CP870,CP871,CP874,CP875,CP880,CP891,CP903,CP904,CP905,CP912,CP915,CP916,CP918,CP920,CP922,CP930,CP932,CP933,CP935,CP936,CP937,CP939,CP949,CP950,CP1004,CP1026,CP1046,CP1047,CP1070,CP1079,CP1081,CP1084,CP1089,CP1124,CP1125,CP1129,CP1132,CP1133,CP1160,CP1161,CP1162,CP1163,CP1164,CP1250,CP1251,CP1252,CP1253,CP1254,CP1255,CP1256,CP1257,CP1258,CP1361,CP10007,CPIBM861,CSA7-1,CSA7-2,CSASCII,CSA_T500-1983,CSA_T500,CSA_Z243.4-1985-1,CSA_Z243.4-1985-2,CSA_Z243.419851,CSA_Z243.419852,CSDECMCS,CSEBCDICATDE,CSEBCDICATDEA,CSEBCDICCAFR,CSEBCDICDKNO,CSEBCDICDKNOA,CSEBCDICES,CSEBCDICESA,CSEBCDICESS,CSEBCDICFISE,CSEBCDICFISEA,CSEBCDICFR,CSEBCDICIT,CSEBCDICPT,CSEBCDICUK,CSEBCDICUS,CSEUCKR,CSEUCPKDFMTJAPANESE,CSGB2312,CSHPROMAN8,CSIBM037,CSIBM038,CSIBM273,CSIBM274,CSIBM275,CSIBM277,CSIBM278,CSIBM280,CSIBM281,CSIBM284,CSIBM285,CSIBM290,CSIBM297,CSIBM420,CSIBM423,CSIBM424,CSIBM500,CSIBM851,CSIBM855,CSIBM856,CSIBM857,CSIBM860,CSIBM863,CSIBM864,CSIBM865,CSIBM866,CSIBM868,CSIBM869,CSIBM870,CSIBM871,CSIBM880,CSIBM891,CSIBM903,CSIBM904,CSIBM905,CSIBM918,CSIBM922,CSIBM930,CSIBM932,CSIBM933,CSIBM935,CSIBM937,CSIBM939,CSIBM943,CSIBM1026,CSIBM1124,CSIBM1129,CSIBM1132,CSIBM1133,CSIBM1160,CSIBM1161,CSIBM1163,CSIBM1164,CSIBM11621162,CSISO4UNITEDKINGDOM,CSISO10SWEDISH,CSISO11SWEDISHFORNAMES,CSISO14JISC6220RO,CSISO15ITALIAN,CSISO16PORTUGESE,CSISO17SPANISH,CSISO18GREEK7OLD,CSISO19LATINGREEK,CSISO21GERMAN,CSISO25FRENCH,CSISO27LATINGREEK1,CSISO49INIS,CSISO50INIS8,CSISO51INISCYRILLIC,CSISO58GB1988,CSISO60DANISHNORWEGIAN,CSISO60NORWEGIAN1,CSISO61NORWEGIAN2,CSISO69FRENCH,CSISO84PORTUGUESE2,CSISO85SPANISH2,CSISO86HUNGARIAN,CSISO88GREEK7,CSISO89ASMO449,CSISO90,CSISO92JISC62991984B,CSISO99NAPLPS,CSISO103T618BIT,CSISO111ECMACYRILLIC,CSISO121CANADIAN1,CSISO122CANADIAN2,CSISO139CSN369103,CSISO141JUSIB1002,CSISO143IECP271,CSISO150,CSISO150GREEKCCITT,CSISO151CUBA,CSISO153GOST1976874,CSISO646DANISH,CSISO2022CN,CSISO2022JP,CSISO2022JP2,CSISO2022KR,CSISO2033,CSISO5427CYRILLIC,CSISO5427CYRILLIC1981,CSISO5428GREEK,CSISO10367BOX,CSISOLATIN1,CSISOLATIN2,CSISOLATIN3,CSISOLATIN4,CSISOLATIN5,CSISOLATIN6,CSISOLATINARABIC,CSISOLATINCYRILLIC,CSISOLATINGREEK,CSISOLATINHEBREW,CSKOI8R,CSKSC5636,CSMACINTOSH,CSNATSDANO,CSNATSSEFI,CSN_369103,CSPC8CODEPAGE437,CSPC775BALTIC,CSPC850MULTILINGUAL,CSPC862LATINHEBREW,CSPCP852,CSSHIFTJIS,CSUCS4,CSUNICODE,CUBA,CWI-2,CWI,CYRILLIC,DE,DEC-MCS,DEC,DECMCS,DIN_66003,DK,DS2089,DS_2089,E13B,EBCDIC-AT-DE-A,EBCDIC-AT-DE,EBCDIC-BE,EBCDIC-BR,EBCDIC-CA-FR,EBCDIC-CP-AR1,EBCDIC-CP-AR2,EBCDIC-CP-BE,EBCDIC-CP-CA,EBCDIC-CP-CH,EBCDIC-CP-DK,EBCDIC-CP-ES,EBCDIC-CP-FI,EBCDIC-CP-FR,EBCDIC-CP-GB,EBCDIC-CP-GR,EBCDIC-CP-HE,EBCDIC-CP-IS,EBCDIC-CP-IT,EBCDIC-CP-NL,EBCDIC-CP-NO,EBCDIC-CP-ROECE,EBCDIC-CP-SE,EBCDIC-CP-TR,EBCDIC-CP-US,EBCDIC-CP-WT,EBCDIC-CP-YU,EBCDIC-CYRILLIC,EBCDIC-DK-NO-A,EBCDIC-DK-NO,EBCDIC-ES-A,EBCDIC-ES-S,EBCDIC-ES,EBCDIC-FI-SE-A,EBCDIC-FI-SE,EBCDIC-FR,EBCDIC-GREEK,EBCDIC-INT,EBCDIC-INT1,EBCDIC-IS-FRISS,EBCDIC-IT,EBCDIC-JP-E,EBCDIC-JP-KANA,EBCDIC-PT,EBCDIC-UK,EBCDIC-US,EBCDICATDE,EBCDICATDEA,EBCDICCAFR,EBCDICDKNO,EBCDICDKNOA,EBCDICES,EBCDICESA,EBCDICESS,EBCDICFISE,EBCDICFISEA,EBCDICFR,EBCDICISFRISS,EBCDICIT,EBCDICPT,EBCDICUK,EBCDICUS,ECMA-114,ECMA-118,ECMA-128,ECMA-CYRILLIC,ECMACYRILLIC,ELOT_928,ES,ES2,EUC-CN,EUC-JISX0213,EUC-JP,EUC-KR,EUC-TW,EUCCN,EUCJP,EUCKR,EUCTW,FI,FR,GB,GB2312,GB13000,GB18030,GBK,GB_1988-80,GB_198880,GEORGIAN-ACADEMY,GEORGIAN-PS,GOST_19768-74,GOST_19768,GOST_1976874,GREEK-CCITT,GREEK,GREEK7-OLD,GREEK7,GREEK7OLD,GREEK8,GREEKCCITT,HEBREW,HP-ROMAN8,HPROMAN8,HU,IBM-856,IBM-922,IBM-930,IBM-932,IBM-933,IBM-935,IBM-937,IBM-939,IBM-943,IBM-1046,IBM-1124,IBM-1129,IBM-1132,IBM-1133,IBM-1160,IBM-1161,IBM-1162,IBM-1163,IBM-1164,IBM037,IBM038,IBM256,IBM273,IBM274,IBM275,IBM277,IBM278,IBM280,IBM281,IBM284,IBM285,IBM290,IBM297,IBM367,IBM420,IBM423,IBM424,IBM437,IBM500,IBM775,IBM813,IBM819,IBM848,IBM850,IBM851,IBM852,IBM855,IBM856,IBM857,IBM860,IBM861,IBM862,IBM863,IBM864,IBM865,IBM866,IBM866NAV,IBM868,IBM869,IBM870,IBM871,IBM874,IBM875,IBM880,IBM891,IBM903,IBM904,IBM905,IBM912,IBM915,IBM916,IBM918,IBM920,IBM922,IBM930,IBM932,IBM933,IBM935,IBM937,IBM939,IBM943,IBM1004,IBM1026,IBM1046,IBM1047,IBM1089,IBM1124,IBM1129,IBM1132,IBM1133,IBM1160,IBM1161,IBM1162,IBM1163,IBM1164,IEC_P27-1,IEC_P271,INIS-8,INIS-CYRILLIC,INIS,INIS8,INISCYRILLIC,ISIRI-3342,ISIRI3342,ISO-2022-CN-EXT,ISO-2022-CN,ISO-2022-JP-2,ISO-2022-JP-3,ISO-2022-JP,ISO-2022-KR,ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4,ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,ISO-8859-9,ISO-8859-10,ISO-8859-11,ISO-8859-13,ISO-8859-14,ISO-8859-15,ISO-8859-16,ISO-10646,ISO-10646/UCS2,ISO-10646/UCS4,ISO-10646/UTF-8,ISO-10646/UTF8,ISO-CELTIC,ISO-IR-4,ISO-IR-6,ISO-IR-8-1,ISO-IR-9-1,ISO-IR-10,ISO-IR-11,ISO-IR-14,ISO-IR-15,ISO-IR-16,ISO-IR-17,ISO-IR-18,ISO-IR-19,ISO-IR-21,ISO-IR-25,ISO-IR-27,ISO-IR-37,ISO-IR-49,ISO-IR-50,ISO-IR-51,ISO-IR-54,ISO-IR-55,ISO-IR-57,ISO-IR-60,ISO-IR-61,ISO-IR-69,ISO-IR-84,ISO-IR-85,ISO-IR-86,ISO-IR-88,ISO-IR-89,ISO-IR-90,ISO-IR-92,ISO-IR-98,ISO-IR-99,ISO-IR-100,ISO-IR-101,ISO-IR-103,ISO-IR-109,ISO-IR-110,ISO-IR-111,ISO-IR-121,ISO-IR-122,ISO-IR-126,ISO-IR-127,ISO-IR-138,ISO-IR-139,ISO-IR-141,ISO-IR-143,ISO-IR-144,ISO-IR-148,ISO-IR-150,ISO-IR-151,ISO-IR-153,ISO-IR-155,ISO-IR-156,ISO-IR-157,ISO-IR-166,ISO-IR-179,ISO-IR-193,ISO-IR-197,ISO-IR-199,ISO-IR-203,ISO-IR-209,ISO-IR-226,ISO646-CA,ISO646-CA2,ISO646-CN,ISO646-CU,ISO646-DE,ISO646-DK,ISO646-ES,ISO646-ES2,ISO646-FI,ISO646-FR,ISO646-FR1,ISO646-GB,ISO646-HU,ISO646-IT,ISO646-JP-OCR-B,ISO646-JP,ISO646-KR,ISO646-NO,ISO646-NO2,ISO646-PT,ISO646-PT2,ISO646-SE,ISO646-SE2,ISO646-US,ISO646-YU,ISO2022CN,ISO2022CNEXT,ISO2022JP,ISO2022JP2,ISO2022KR,ISO6937,ISO8859-1,ISO8859-2,ISO8859-3,ISO8859-4,ISO8859-5,ISO8859-6,ISO8859-7,ISO8859-8,ISO8859-9,ISO8859-10,ISO8859-11,ISO8859-13,ISO8859-14,ISO8859-15,ISO8859-16,ISO88591,ISO88592,ISO88593,ISO88594,ISO88595,ISO88596,ISO88597,ISO88598,ISO88599,ISO885910,ISO885911,ISO885913,ISO885914,ISO885915,ISO885916,ISO_646.IRV:1991,ISO_2033-1983,ISO_2033,ISO_5427-EXT,ISO_5427,ISO_5427:1981,ISO_5427EXT,ISO_5428,ISO_5428:1980,ISO_6937-2,ISO_6937-2:1983,ISO_6937,ISO_6937:1992,ISO_8859-1,ISO_8859-1:1987,ISO_8859-2,ISO_8859-2:1987,ISO_8859-3,ISO_8859-3:1988,ISO_8859-4,ISO_8859-4:1988,ISO_8859-5,ISO_8859-5:1988,ISO_8859-6,ISO_8859-6:1987,ISO_8859-7,ISO_8859-7:1987,ISO_8859-8,ISO_8859-8:1988,ISO_8859-9,ISO_8859-9:1989,ISO_8859-10,ISO_8859-10:1992,ISO_8859-14,ISO_8859-14:1998,ISO_8859-15:1998,ISO_9036,ISO_10367-BOX,ISO_10367BOX,ISO_69372,IT,JIS_C6220-1969-RO,JIS_C6229-1984-B,JIS_C62201969RO,JIS_C62291984B,JOHAB,JP-OCR-B,JP,JS,JUS_I.B1.002,KOI-7,KOI-8,KOI8-R,KOI8-T,KOI8-U,KOI8,KOI8R,KOI8U,KSC5636,L1,L2,L3,L4,L5,L6,L7,L8,L10,LATIN-GREEK-1,LATIN-GREEK,LATIN1,LATIN2,LATIN3,LATIN4,LATIN5,LATIN6,LATIN7,LATIN8,LATIN10,LATINGREEK,LATINGREEK1,MAC-CYRILLIC,MAC-IS,MAC-SAMI,MAC-UK,MAC,MACCYRILLIC,MACINTOSH,MACIS,MACUK,MACUKRAINIAN,MS-ANSI,MS-ARAB,MS-CYRL,MS-EE,MS-GREEK,MS-HEBR,MS-MAC-CYRILLIC,MS-TURK,MSCP949,MSCP1361,MSMACCYRILLIC,MSZ_7795.3,MS_KANJI,NAPLPS,NATS-DANO,NATS-SEFI,NATSDANO,NATSSEFI,NC_NC0010,NC_NC00-10,NC_NC00-10:81,NF_Z_62-010,NF_Z_62-010_(1973),NF_Z_62-010_1973,NF_Z_62010,NF_Z_62010_1973,NO,NO2,NS_4551-1,NS_4551-2,NS_45511,NS_45512,OS2LATIN1,OSF00010001,OSF00010002,OSF00010003,OSF00010004,OSF00010005,OSF00010006,OSF00010007,OSF00010008,OSF00010009,OSF0001000A,OSF00010020,OSF00010100,OSF00010101,OSF00010102,OSF00010104,OSF00010105,OSF00010106,OSF00030010,OSF0004000A,OSF0005000A,OSF05010001,OSF100201A4,OSF100201A8,OSF100201B5,OSF100201F4,OSF100203B5,OSF1002011C,OSF1002011D,OSF1002035D,OSF1002035E,OSF1002035F,OSF1002036B,OSF1002037B,OSF10010001,OSF10020025,OSF10020111,OSF10020115,OSF10020116,OSF10020118,OSF10020122,OSF10020129,OSF10020352,OSF10020354,OSF10020357,OSF10020359,OSF10020360,OSF10020364,OSF10020365,OSF10020366,OSF10020367,OSF10020370,OSF10020387,OSF10020388,OSF10020396,OSF10020402,OSF10020417,PT,PT2,R8,ROMAN8,RUSCII,SE,SE2,SEN_850200_B,SEN_850200_C,SHIFT-JIS,SHIFT_JIS,SHIFT_JISX0213,SJIS,SS636127,ST_SEV_358-88,T.61-8BIT,T.61,T.618BIT,TCVN-5712,TCVN,TCVN5712-1,TCVN5712-1:1993,TIS-620,TIS620-0,TIS620.2529-1,TIS620.2533-0,TIS620,TS-5881,TSCII,UCS-2,UCS-2BE,UCS-2LE,UCS-4,UCS-4BE,UCS-4LE,UCS2,UCS4,UHC,UJIS,UK,UNICODE,UNICODEBIG,UNICODELITTLE,US-ASCII,US,UTF-7,UTF-8,UTF-16,UTF-16BE,UTF-16LE,UTF-32,UTF-32BE,UTF-32LE,UTF7,UTF8,UTF16,UTF16BE,UTF16LE,UTF32,UTF32BE,UTF32LE,VISCII,WCHAR_T,WIN-SAMI-2,WINBALTRIM,WINDOWS-1250,WINDOWS-1251,WINDOWS-1252,WINDOWS-1253,WINDOWS-1254,WINDOWS-1255,WINDOWS-1256,WINDOWS-1257,WINDOWS-1258,WINSAMI2,WS2,YU
指令: #iconv -f gb2312 -t utf-8 gb1.txt > gb2.txt 将gb1里的编码从GB2312转化成UTF-8 并重定向到gb2.txt 除了iconv命令,我们在linux系统下的man page的第三节还可以看到一组iconv函数。它们分别是 iconv_ticonv_open(constchar*tocode,constchar*fromcode); size_ticonv(iconv_tcd,char**inbuf,size_t*inbytesleft,char**outbuf,size_t*outbytesleft); inticonv_close(iconv_tcd); iconv_open函数用来打开一个编码转换的流,iconv函数的作用是实际进行转换,iconv_close函数的作用就是关闭这个流。实际用法参见下面的例子,下面是一个将UTF-8码转换成GBK码的例子,我们假设已经有了一个uft8编码的输入缓冲区inbuf以及这个缓冲区的长度inlen。 iconv_tcd=iconv_open("GBK","UTF-8"); char*outbuf=(char*)malloc(inlen*4); bzero(outbuf,inlen*4); char*in=inbuf; char*out=outbuf; size_toutlen=inlen*4; iconv(cd,&in,(size_t*)&inlen,&out,&outlen); outlen=strlen(outbuf); printf("%s ",outbuf); free(outbuf); iconv_close(cd); 非常值得注意的地方是:iconv函数会修改参数in和参数out指针所指向的地方,也就是说,在调用iconv函数之前,我们的in和inbuf指针以及out和outbuf指针指向的是同一块内存区域,但是调用之后out指针所指向的地方就不是outbuf了,同理in指针。所以要 char*in=inbuf;char*out=outbuf; 另存一下,使用或者释放内存的时候也要使用原先的那个指针outbuf和inbuf。 php下使用方法 unix下安装PHP的module,需要重新编译PHP,Windows下安装模板,只需将php.ini里的配置打开相应的dll就可,例如,需要加入gb库的支持,需要如下设置: extension_dir=“C:/ipaddr/php/extensions/” (注意,建议写全地址,并且后面加上/,很多时候是因为这里设置不对,才导致无法加载其它模块的dll的) 再打开 extension=php_gd2.dll 但如果是安装iconv.dll,按上面方法,打开php_iconv.dll后,还是无法开启iconv模块,需要如下配置: a.上iconv的官方下载站点 下面Windows版的iconv文件:libiconv-1.9.1.bin.woe32.zip 将这文件解压,将bin/下面的charset.dll,iconv.dll,iconv.exe拷贝到c:/windows/ (或其它的系统PATH中) (ipaddr提醒你,这步是必须的,php_iconv.dll也是调用GNU的iconv库的,所以,先要安装GNU的iconv库) b.开启php.ini里面的php_iconv.dll c.重启Apache,再在phpinfo();检测是否开启iconv。 最近在做一个程序,需要用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些。 让我郁闷了好一会儿,去网上一查资料才知道这是iconv函数的一个bug。iconv在转换字符”—”到gb2312时会出错 解决方法很简单,就是在需要转成的编码后加 “//IGNORE” 也就是iconv函数第二个参数后.如下: 以下为引用的内容: iconv(“UTF-8″,”GB2312//IGNORE”,$data) ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符串都无法被保存。 这个iconv()这个函数,在php5中是内置的. 列子 <?phpecho$str=‘你好,这里是卖咖啡!’;echo‘<br/>’;echoiconv(‘GB2312′,‘UTF-8′,$str);//将字符串的编码从GB2312转到UTF-8echo‘<br/>’;echoiconv_substr($str,1,1,‘UTF-8′);//按字符个数截取而非字节print_r(iconv_get_encoding());//得到当前页面编码信息echoiconv_strlen($str,‘UTF-8′);//得到设定编码的字符串长度//也有这样用的$content=iconv(“UTF-8″,”gbk//TRANSLIT”,$content);?>使用注意问题 在使用这个函数进行字符串编码转换时,需要注意,如果将utf-8转换为gb2312时,可能会出现字符串被截断的情况发生。 stringiconv(string$in_charset,string$out_charset,string$str) 在使用这个函数进行字符串编码转换时,需要注意,如果将utf-8转换为gb2312时,可能会出现字符串被截断的情况发生。 此时可以使用以下方法解决: //author:zhxia$str=iconv('utf-8',"gb2312//TRANSLIT",file_get_contents($filepath)); 即在第二个参数出添加红色字部分,表示:如果在目标编码中找不到与源编码相匹配的字符,会选择相似的字符进行转换。 此处也可以使用://IGNORE 这个参数,表示忽略不能转换的字符。

 以上转自:http://baike.baidu.com/link?url=17S9vgAim-xyYluIA00db7eoyuueWWMusP3r6hTSRvwSy9bPCCQmOKbYNgPYo32vdBz5NFDXuzzX_DS_C6XVua

代码展示:

 1 UTFhandle = iconv_open("UTF-8","GB2312");
 2 
 3 int CharetCov(char* srcBuf,  int srcLen, char * destBuf, int destLen)
 4 {
 5     
 6     int srcLen1 = srcLen;
 7     int destLen1 = destLen;
 8     int err= iconv(UTFhandle,&srcBuf, (size_t *)&srcLen1, &destBuf, (size_t *)&destLen1);
 9     if(err < 0)
10     {  
11         
12         err = errno;
13         errno = 0;
14     }
15 
16     return err;
17 }
18 
19 iconv_close(UTFhandle);

免责声明:文章转载自《C++用iconv进行页面字符转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IDEA通过Maven打包JavaFX工程(OpenJFX11)html5 如何打包成apk,将H5封装成android应用APK文件的几种方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

node.js的iconv模块----在linux上读取windows编码文件

有时候我们在windows上会保存一些中文文字信息文件,然而由于编码集的差异,这文件在linux上显示为乱码,其中一种解决方法是node.js的iconv模块 var fs = require('fs'); var readstream = fs.createReadStream('./新建文本文档.txt'); var str=''; var iconv...

getchar()和scanf()混合使用的坑

最近在混合使用 getchar() 和 scanf() 的时候遇到一个坑,现在记录一下。 代码中使用 getchar() 处理字符输入,用 scanf() 处理数字输入。 getchar() 读取每个字符,包括空格、制表符和换行符; 而 scanf() 在读取数字时则会跳过空格、 制表符和换行符。 比如下面这个程序,读入一个字符和两个数字,然后根据输入的两...

C++(四十八) — string容器的基本操作

参考博客:https://blog.csdn.net/qq_37941471/article/details/82107077 https://www.cnblogs.com/danielStudy/p/7127564.html#top 1、声明一个字符串 标准库类型string表示可变长的字符序列,为了在程序中使用string类型,我们必须包含头文件:#...

java字符编码和oracle乱码

编码问题我仍旧没搞懂,最根本的从哪里来就没搞懂。当页面发送请求,编码到后台是什么编码呢?好吧,我默认的都是utf-8.后台接收参数后,可以在控制台打印出来,我也不清楚是什么编码。然后,就是数据库问题。 在mysql数据库,首先会设置mysql安装的字符集为utf-8,然后在连接的jdbc上注明characterEncoding是utf-8.一直这样统一下去...

多种方式实现字符串/无符号数反向输出_栈_递归_头尾指针

1、递归调用方式实现无符号数反向输出 C语言实现(DEV c++4.9.9.2运行通过) #include<stdio.h> void reverse_print(unsigned long num) { if(num==0) return; printf("%d",num%10); //输出最低位...

Servlet第三篇【request和response简介、response的常见应用】

response、request对象 Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象、和代表响应的response对象 既然request对象代表http请求,那么我们获取浏览器提交过来的数据,找request对象即可。response对象代表http响应,那么我们向浏览器输出数据,找response对象...