ICONV编码转换从UTF-8到ASCII,中文字符的问题

finrod86921812 2014-04-29 11:09:39
#include <iostream>
#include "iconv.h"

#include <errno.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;

int UTF8ToUnicode(const char *strUTF8,wchar_t **strUnicode) //UTF8 to Unicode
{
//UTF-8 to UTF-16
iconv_t conveter = iconv_open("UTF-16","UTF-8");

size_t inBytes=strlen(strUTF8) * sizeof(char);
size_t outBytes=strlen(strUTF8) * sizeof(wchar_t);

*strUnicode =new wchar_t[outBytes + 1];
wmemset(*strUnicode,0,outBytes + 1);

const char* strUTF8_tmp = strUTF8;
char* strUnicode_tmp= (char*)*strUnicode;

size_t rc=iconv(conveter,(const char**) &strUTF8_tmp, &inBytes, &strUnicode_tmp, &outBytes);

iconv_close(conveter);
if(rc == size_t(0))
{

return 1;
}
else
{
return -1;
}
}

int UnicodeToUTF8(const wchar_t *strUnicode, char **strUTF8) //Unicode To UTF8
{
//UTF-16 to UTF-8
iconv_t conveter = iconv_open("UTF-8","UTF-16");

size_t inBytes=wcslen(strUnicode) * sizeof(wchar_t);
size_t outBytes=wcslen(strUnicode) * 4;

*strUTF8 =new char[outBytes + 1];
memset(*strUTF8,0,outBytes + 1);

const char* strUnicode_tmp= (char*)strUnicode;
char* strUTF8_tmp = *strUTF8;

size_t rc=iconv(conveter,(const char**) &strUnicode_tmp, &inBytes, &strUTF8_tmp, &outBytes);
iconv_close(conveter);
if(rc == size_t(0))
{
return 1;
}
else
{
return -1;
}
}

int UTF8ToASCII(const char *strUTF8, char **strASCII) //UTF8 To ASCII
{
size_t inBytes=strlen(strUTF8) * sizeof(char);
size_t outBytes=1024;

*strASCII =new char[outBytes + 1];
memset(*strASCII,0,outBytes + 1);

const char* strUTF8_tmp = strUTF8;
char* strASCII_tmp= *strASCII;

char* gbChar = new char[outBytes + 1];
char* gbChar_tmp = gbChar;

iconv_t conveter = iconv_open("gb2312","UTF-8");
size_t rc=iconv(conveter,(const char**) &strUTF8_tmp, &inBytes, &gbChar_tmp, &outBytes);


conveter = iconv_open("ASCII","gb2312");
gbChar_tmp = gbChar;
rc=iconv(conveter,(const char**) &gbChar_tmp, &outBytes, &strASCII_tmp, &outBytes);

iconv_close(conveter);
if(rc == size_t(0))
{

return 1;
}
else
{
return -1;
}
}

int main()
{
char* utf8Char = "hello world 你好";
wchar_t *utf16Char = NULL;
char* asciiChar = NULL;

UTF8ToUnicode(utf8Char,&utf16Char);

UTF8ToASCII(utf8Char,&asciiChar);

return 0;
}



这是整个测试程序的代码,目的是要实现UTF8到UTF16和ASCII的编码转换。
调试过程中UTF8到UTF16的转换没有问题,
而直接转换到ASCII,当转换到中文字符“你好”时,就出现错误,errno= EILSEQ /* Illegal byte sequence */

后来考虑先转为gb2312,然后再转成ASCII会不会成功。

"你好“的gb2313编码分别为 C4E3和BAC3 转换成十进制就是 196 227 186 195 ,可见转换成gb2313 时,还是正确的。
但是从gb2313转ASCII码,还是出现同样的错误,转换完world后面的空格(ASCII码为32)然后就结束了,然后报错。

有人知道是什么问题吗?
...全文
979 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
libocdf 2016-01-15
  • 打赏
  • 举报
回复
完全不知道什么问题!!

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧