注意:
(一)size_t iconv (iconv_t cd,
const char* * inbuf, size_t * inbytesleft,
char* * outbuf, size_t * outbytesleft);
函数iconv在调用之后输出的* outbytesleft值并非转码输出的字节长度,而是说明了outbuf中有多少字节剩余,所以应该在函数调用之前先保存* outbytesleft的值(outsize = * outbytesleft),在函数调用之后再outsize - * outbytesleft,就得到转码后输出的字符串的字节数了。
(二)
函数iconv在调用会改变outbuf的值,所以调用函数之前应该先保存其原始值,以便获得转码后的数据
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <iconv.h>
int main()
{
int i =
0;
iconv_t
convert = iconv_open("UTF-8", "UTF-16"); //iconv_open(const char*
tocode, const char* fromcode)
if (convert
== iconv_t(-1)) {
printf("encode convert not supported!\n");
//if (errno == EINVAL)
//cout << "einval"
<< endl;
return -1;
}
//char
str[12] = {0xff, 0xfe, 0x68, 0x0, 0x65, 0x0, 0x6c, 0x0, 0x6c, 0x0,
0x6f, 0x0};
char str[12]
= { 0xff, 0xfe, 0x10, 0x55, 0xe3, 0x5a, 0x2c, 0x0, 0x57, 0x7f,
0x4b, 0x66 }; //唐嫣,罗晋
//size_t
insize = strlen(str)+1;
//char
*input = (char*)malloc(insize);
size_t
insize = 12;
char *input
= (char*) malloc(insize);
char *old1 =
input; //save address
memcpy(input, str, insize);
for (i = 0;
i < insize; i++) {
printf("%x ", old1[i]);
}
printf("\n");
size_t
outsize = insize + 20;
char *output
= (char*) malloc(outsize);
char *old2 =
output; //save address
memset(output, 0, outsize);
int rc =
iconv(convert, (const char**) &input,
&insize, &output,
&outsize);
if (rc != 0)
{
if (errno == EILSEQ)
printf("EILSEQ\n");
else if (errno == EINVAL)
printf("EINVAL\n");
}
printf("output is : %d,%d, %d: %s\n", outsize, strlen(old2), rc,
old2);
//转换后的内容存在原output地址处,由于output值被iconv修改了,因此通过old2来得到原output值
for (i = 0;
i < 32 - outsize; i++) {
printf("%x ", old2[i]);
}
printf("\n");
free(old1);
free(old2);
iconv_close(convert);
return
0;
}
(一)size_t iconv (iconv_t cd,
函数iconv在调用之后输出的* outbytesleft值并非转码输出的字节长度,而是说明了outbuf中有多少字节剩余,所以应该在函数调用之前先保存* outbytesleft的值(outsize = * outbytesleft),在函数调用之后再outsize - * outbytesleft,就得到转码后输出的字符串的字节数了。
(二)
函数iconv在调用会改变outbuf的值,所以调用函数之前应该先保存其原始值,以便获得转码后的数据
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <iconv.h>
int main()
{
}