⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iconvme.c

📁 一个收集所有最基本功能的函数库;所有的函数都是尽量短小和简单 使用 doxygen 生成文档 所有代码以在 Linux 系统上可以编译并运行为准;每当在 lib 目录里增加了一个功能函数
💻 C
字号:
/*************************************************************************** *            iconvme.c * *  Tue May 22 17:01:55 2007 *  Copyright  2007  kf701 *  Email <kf701.ye AT gmail.com> ****************************************************************************//* *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <iconv.h>#include <limits.h>#ifndef SIZE_MAX# define SIZE_MAX ((size_t) -1)#endif/** * @brief codeset convert * * Convert a zero-terminated string STR from the FROM_CODSET code set * to the TO_CODESET code set.  The returned string is allocated using * malloc, and must be dellocated by the caller using free.  On * failure, NULL is returned and errno holds the error reason.  Note * that if TO_CODESET uses 0 for anything but to terminate the * string, the caller of this function may have difficulties finding * out the length of the output string. * * @param str  raw buffer need convert * @param from_codeset such as "gbk" * @param to_codeset such as "utf-8" * * @return the converted buffer or NULL when faild * you must free the retval buffer yourself * */char *iconv_string (const char *str, const char *from_codeset,		const char *to_codeset){	char *dest = NULL;	iconv_t cd;	char *outp;	char *p = (char *) str;	size_t inbytes_remaining = strlen (p);	/* Guess the maximum length the output string can have.  */	size_t outbuf_size = inbytes_remaining + 1;	size_t outbytes_remaining;	size_t err;	int have_error = 0;	/* Use a worst-case output size guess, so long as that wouldn't be	   too large for comfort.  It's OK if the guess is wrong so long as	   it's nonzero.  */	size_t approx_sqrt_SIZE_MAX = SIZE_MAX >> (sizeof (size_t) * CHAR_BIT / 2);	if (outbuf_size <= approx_sqrt_SIZE_MAX / MB_LEN_MAX)		outbuf_size *= MB_LEN_MAX;	outbytes_remaining = outbuf_size - 1;	if (strcmp (to_codeset, from_codeset) == 0)		return strdup (str);	cd = iconv_open (to_codeset, from_codeset);	if (cd == (iconv_t) -1)		return NULL;	outp = dest = (char *) malloc (outbuf_size);	if (dest == NULL)		goto out;again:	err = iconv (cd, &p, &inbytes_remaining, &outp, &outbytes_remaining);	if (err == (size_t) - 1)	{		switch (errno)		{			case EINVAL:				/* Incomplete text, do not report an error */				break;			case E2BIG:				{					size_t used = outp - dest;					size_t newsize = outbuf_size * 2;					char *newdest;					if (newsize <= outbuf_size)					{						errno = ENOMEM;						have_error = 1;						goto out;					}					newdest = (char *) realloc (dest, newsize);					if (newdest == NULL)					{						have_error = 1;						goto out;					}					dest = newdest;					outbuf_size = newsize;					outp = dest + used;					outbytes_remaining = outbuf_size - used - 1;	/* -1 for NUL */					goto again;				}				break;			case EILSEQ:				have_error = 1;				break;			default:				have_error = 1;				break;		}	}	*outp = '\0';out:	{		int save_errno = errno;		if (iconv_close (cd) < 0 && !have_error)		{			/* If we didn't have a real error before, make sure we restore			   the iconv_close error below. */			save_errno = errno;			have_error = 1;		}		if (have_error && dest)		{			free (dest);			dest = NULL;			errno = save_errno;		}	}	return dest;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -