/////////////////////////////////////////////////////////////////////////////////////
/// 此内容摘自 linux 上 iconv 命令程序代码,目的在于处理转码出现无效字符的情况
////////////////////////////////////////////////////////////////////////////////////
struct iconv_hooks {};
struct iconv_fallbacks {};
typedef unsigned int ucs4_t;
typedef struct conv_struct * conv_t;
struct loop_funcs {
size_t (*loop_convert) (iconv_t icd,
const char* * inbuf, size_t *inbytesleft,
char* * outbuf, size_t *outbytesleft);
size_t (*loop_reset) (iconv_t icd,
char* * outbuf, size_t *outbytesleft);
};
struct mbtowc_funcs {
int (*xxx_mbtowc) (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n);
/*
* int xxx_mbtowc (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n)
* converts the byte sequence starting at s to a wide character. Up to n bytes
* are available at s. n is >= 1.
* Result is number of bytes consumed (if a wide character was read),
* or -1 if invalid, or -2 if n too small, or -2-(number of bytes consumed)
* if only a shift sequence was read.
*/
int (*xxx_flushwc) (conv_t conv, ucs4_t *pwc);
/*
* int xxx_flushwc (conv_t conv, ucs4_t *pwc)
* returns to the initial state and stores the pending wide character, if any.
* Result is 1 (if a wide character was read) or 0 if none was pending.
*/
};
struct wctomb_funcs {
int (*xxx_wctomb) (conv_t conv, unsigned char *r, ucs4_t wc, int n);
/*
* int xxx_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
* converts the wide character wc to the character set xxx, and stores the
* result beginning at r. Up to n bytes may be written at r. n is >= 1.
* Result is number of bytes written, or -1 if invalid, or -2 if n too small.
*/
int (*xxx_reset) (conv_t conv, unsigned char *r, int n);
/*
* int xxx_reset (conv_t conv, unsigned char *r, int n)
* stores a shift sequences returning to the initial state beginning at r.
* Up to n bytes may be written at r. n is >= 0.
* Result is number of bytes written, or -2 if n too small.
*/
};
typedef unsigned int state_t;
struct conv_struct {
struct loop_funcs lfuncs;
/* Input (conversion multibyte -> unicode) */
int iindex;
struct mbtowc_funcs ifuncs;
state_t istate;
/* Output (conversion unicode -> multibyte) */
int oindex;
struct wctomb_funcs ofuncs;
int oflags;
state_t ostate;
/* Operation flags */
int transliterate;
int discard_ilseq;
#ifndef LIBICONV_PLUG
struct iconv_fallbacks fallbacks;
struct iconv_hooks hooks;
#endif
};
////////////////////////////////////////////////////////////
/// 转载结束
////////////////////////////////////////////////////////////
int __charcode_convert__(LPCSTR from, LPCSTR to, LPSTR save, int savelen, LPSTR src, int srclen, bool ignore_invalid_sequence)
{
iconv_t cd;
char *inbuf = src;
char *outbuf = save;
size_t outbufsize = savelen;
int status = 0;
size_t savesize = 0;
size_t inbufsize = srclen;
const char* inptr = inbuf;
size_t insize = inbufsize;
char* outptr = outbuf;
size_t outsize = outbufsize;
if (!ignore_invalid_sequence)
cd = iconv_open(to, from);
else
{
char tochartset[64]={0};
sprintf(tochartset, "%s//IGNORE", to);
cd = iconv_open(tochartset, from);
}
if (cd == (iconv_t)(-1))
{
printf("iconv_open oper error!\n");
status = -1;
goto done;
}
iconv(cd, NULL, NULL, NULL, NULL);
if (inbufsize == 0)
{
status = -1;
goto done;
}
int invaild_do;
invaild_do = 0;
while (insize > 0)
{
size_t res = iconv(cd, (char**)&inptr, &insize, &outptr, &outsize);
if (res == (size_t)(-1))
{
if (errno == EILSEQ)
{
if (invaild_do == 0)
{
((conv_t)cd)->discard_ilseq = 1;
invaild_do = 1;
continue;
}
status = -3;
goto done;
}
else if (errno == EINVAL)
{
if (inbufsize == 0)
{
status = -4;
goto done;
}
else
{
break;
}
}
else if (errno == E2BIG)
{
status = -5;
goto done;
}
else
{
status = -6;
goto done;
}
}
invaild_do = 0;
if (outptr != outbuf)
{
int saved_errno = errno;
int outsize = outptr - outbuf;
strncpy(save+savesize, outbuf, outsize);
errno = saved_errno;
}
lj_sleep(0, 1);
}
status = strlen(save);
status = status > 0 ? 0 : -1;
done:
iconv_close(cd);
return status;
}
char *charcode_convert(LPCSTR from, LPCSTR to, LPSTR src, int srclen, bool ignore_invalid_sequence)
{
char *outbuf = (char*)malloc(4*srclen+sizeof(char));
memset(outbuf, 0, 4*srclen+sizeof(char));
if (__charcode_convert__(from, to, outbuf, 4*srclen, src, srclen, ignore_invalid_sequence) != 0)
{
LJFREE(outbuf);
outbuf = (char*)malloc(sizeof(char));
memset(outbuf, 0, sizeof(char));
}
return outbuf;
}
char* utf8_to_chna(char *utf8buf, bool ignore_invalid_sequence, LPCSTR to_chna_charset)
{
return charcode_convert("UTF-8", to_chna_charset, utf8buf, strlen(utf8buf), ignore_invalid_sequence);
}
char* chna_to_utf8(char *chnabuf, bool ignore_invalid_sequence, LPCSTR frm_chna_charset)
{
return charcode_convert(frm_chna_charset, "UTF-8", chnabuf, strlen(chnabuf), ignore_invalid_sequence);
}
分享到:
相关推荐
**iconv库在Windows下的应用** `iconv`是一个用于字符编码转换的库,它在各种操作系统中广泛使用,包括Unix、Linux以及Windows。在Windows环境下,开发人员有时需要处理不同编码之间的转换问题,这时`iconv`库就...
Iconv是一个广泛使用的字符编码转换库,主要用于在不同的字符编码之间进行转换,如从GBK转换到UTF-8。在这个压缩包中,包含了经过封装后的C++接口,使得开发者能够更方便地在C++项目中使用iconv功能。下面将详细介绍...
`iconv.exe`是`iconv`命令行工具的可执行文件,而`iconv.bat`则是一个批处理脚本,它调用`iconv.exe`并可能包含了一些预定义的参数和逻辑,以便用户更方便地使用转码功能。使用时,用户可能只需要在批处理文件中输入...
iconv是一个字符编码转换库,广泛应用于跨平台的软件开发中,特别是在处理多语言编码问题时。在Linux系统中,iconv是内建的一部分,而在Windows系统中,它通常需要额外安装或通过移植来使用。标题提到的"iconv ...
标题中的"iconv.h iconv.lib charset.lib"指的是在编程过程中使用iconv库时所需的头文件和库文件。这些文件是实现字符集转换的关键组成部分,主要用于处理不同编码间的转换问题。 1. **iconv.h**: 这是一个C语言的...
iconv是知名的开源跨平台编码转换库,iconv.exe是iconv库在windows下的命令行工具,iconv.exe的一般用法:iconv.exe -f gbk -t utf-8 gbk.txt > utf-8.txt。其中 -f gbk 指明转换前的文件编码是gbk,-t utf-8 指明...
**编码转换工具iconv详解** 编码转换在信息技术领域中扮演着至关重要的角色,尤其是在处理不同系统、语言或网络环境下的文本数据时。标题中的“iconv.rar”是一个压缩包,包含了一个名为“iconv”的编码转换工具,...
**ICONV转码库静态编译** 在编程领域,字符编码转换是一个常见需求,尤其是在处理多语言或多系统交互时。`iconv`是一个强大的字符集转换库,它提供了跨平台的解决方案,支持多种编码间的转换,如UTF-8、GBK、Shift-...
iconv库是一个重要的字符编码转换工具,广泛应用于各种软件开发中,特别是在处理多语言编码问题时。它提供了接口,使得程序能够将一种字符编码转换为另一种字符编码,这对于跨平台和跨语言的数据交换至关重要。在本...
Luaiconv是一个在Lua语言中用于字符编码转换的库,它允许你在不同的字符集之间进行字符串的转换。这个库特别适用于处理多国语言或者需要在不同编码格式间切换的项目。下面将详细介绍Luaiconv的使用方法、核心功能...
在Windows操作系统中,进行字符编码转换时,可能会遇到与Linux或Unix系统不同的情况,因为Windows原生并不包含iconv库。然而,为了满足跨平台的编码转换需求,开发者们为Windows构建了兼容iconv功能的实现。这个工具...
我在做一个加密芯片项目...1.如要iconv_open、iconv_close这样的名字,需在iconv.h中加入#define LIBICONV_PLUG即可。 2.如要libiconv_open、libiconv_close这样的名字,需在iconv.h中移除#define LIBICONV_PLUG即可。
iconv-1.14-win32-x86_64是一个针对Windows 32位x86_64架构的iconv库版本,它主要用于字符编码转换。iconv是Unicode编码与各种其他字符编码之间转换的一个工具,广泛应用于跨语言环境的软件开发中,以确保数据在不同...
本来以为很简单 结果找了半天发现都是很坑爹的办法 linux下可以直接安装luaiconv windows下呢 只好自己编了 本来想找个别人写好的 发现根本找不到 更坑爹的是 我用eclipse的LDT开发 结果发现它的lua vm没办法加载c库...
**iconv 文件编码转换** 在信息技术领域,文件编码转换是一个重要的任务,特别是在处理不同系统、不同语言或不同软件之间的数据交换时。`iconv` 是一个广泛使用的命令行工具,用于在各种字符编码之间进行转换,确保...
Android NDK(Native Development Kit)提供了一种方法来实现这样的编码转换,这就是使用Iconv库。Iconv是一个广泛使用的字符集转换工具,它允许在多种字符编码之间进行转换,包括Unicode、GBK和UTF-8。 Iconv在C/...
**Nginx与Iconv插件** Nginx是一款高性能的Web服务器/反向代理服务器,因其轻量级、高效稳定的特点,在Web服务领域广泛应用。它支持多种模块化设计,可以扩展其功能,例如处理静态内容、缓存、负载均衡等。其中,`...
iconv.
《apr-iconv-1.2.1:Apache Portable Runtime的编码转换库详解》 在IT领域,Apache Portable Runtime (APR) 是一个重要的开源库,它为多种操作系统提供了底层的接口,使得应用程序能够以跨平台的方式访问系统资源。...
### iconv() 函数的用法详解 #### 一、引言 在处理多语言环境下的文本数据时,经常会遇到不同编码格式之间的转换需求。Linux系统提供了强大的工具和API来帮助开发者解决这些问题,其中最常用的就是`iconv()`函数。...