为何iconv转换不成功呢?
下面的程序从GB2312转换到UTF-8. ibuf里面存放的是 "品 "的GB2312编码,
obuf里面存放将要转换的UTF-8编码,但最后obuf里面内容不正确,
不知道问题出在什么地方? 请指点一下!
#include "stdio.h "
#include "unistd.h "
#include "fcntl.h "
#include "iconv.h "
#include "string.h "
#define BUFLEN 20
int main()
{
iconv_t cd;
char obuf[BUFLEN];
char* pobuf = obuf;
char ibuf[BUFLEN] = {0xc6, 0xb7, 0x00};
char* pibuf = ibuf;
size_t ilen,olen,ret;
const char* from_code = "gb2312 ";
const char* to_code = "utf-8 ";
ilen = strlen(ibuf);
olen = BUFLEN;
printf( "\n ");
if ((cd=iconv_open(to_code, from_code)) == (iconv_t)-1)
{
printf( "failed to conv GB2312 to UTF-8\n ");
exit(-1);
}
if (iconv(cd, &pibuf, &ilen, &pobuf, &olen) == (size_t)-1)
{
printf( "failed to conv buf\n ");
exit(-1);
}
printf( "pobuf = %s\n ", pobuf);
printf( "pobuf[0] = %x, pobuf[1] = %x, pobuf[2] = %x\n ", pobuf[0], pobuf[1], pobuf[2]);
iconv_close(cd);
return 0;
}
------解决方案--------------------源代码在这里:http://code.google.com/p/libkf701/ 一起写来吧
#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