官网资源: https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz CSDN资源:https://download.csdn.net/download/hhhuang1991/11979866 VS2015配置项目+测试代码
编译环境:Win7 64位系统 VS2015
#include <config.h>
改为#include "iconv.h"
localcharset.c文件中#include <config.h>
改为#include "config.h"
fatal error C1083: 无法打开包括文件: “config.h”: No such file or directory
fatal error C1083: 无法打开包括文件: “iconv.h”: No such file or directory
Line21,@DLL_VARIABLE@改为/*@DLL_VARIABLE@*/
Line82,@ICONV_CONST@改为const
Line100, @USE_MBSTATE_T@改为USE_MBSTATE_T
Line101,@BROKEN_WCHAR_H@改为BROKEN_WCHAR_H
Line121, @USE_MBSTATE_T@改为 USE_MBSTATE_T
Line168,@HAVE_WCHAR_T@改为HAVE_WCHAR_T
sprintf
函数,全部替换成安全类型的函数sprintf_s
#include "stdafx.h"
#include "..\libiconv\iconv.h"
#pragma comment(lib, "..\\Debug\\libiconv.lib")
#include <iostream>
using namespace std;
int main()
{
// 将GBK编码的字串,转成UTF-8编码的字
iconv_t cd = iconv_open("UTF-8", "GBK");
if ((iconv_t)-1 == cd)
{
if (EINVAL == errno)
{
cerr << "The conversion from fromcode to tocode is not supported by the implementation" << endl;
}
else {
cerr << "iconv_open fail!" << endl;
}
return -1;
}
// 将转换描述符cd中的转换状态恢复成初始化状态,方法是iconv中的inbuff参数设置成NULL
iconv(cd, NULL, NULL, NULL, NULL);
// 将GBK编码的"啊"转成UTF-8编码
char * inbuff = new char[64];
memset(inbuff, 0, sizeof inbuff);
char *outbuff = new char[64];
memset(outbuff, 0, sizeof outbuff);
// "啊"的GBK编码为0xB0A1,UTF-8编码为0xE2 0x80 0x9C
inbuff[0] = 0xA1;
inbuff[1] = 0xB0;
char * inptr = inbuff; // 为什么要设置这个中间指针inptr,而不支持采用 inbuff?因为iconv会改变指针inbuff的值,这样在删除内存时delete[] inbuff,将会出错
size_t insize = 2;
char * outptr = outbuff; // 作用与inptr类似
size_t outsize = 64;
char *save = new char[64];
memset(save, 0, sizeof save);
size_t outsave = 0;
// 资料介绍,iconv每次只转换一个多字节字符。但是经过测试,只要内容是正常,都是一次转换完,不明白其中缘由。
size_t ret = iconv(cd, (const char **)&inptr, &insize, &outptr, &outsize);
if ((size_t)-1 == ret) {
if (E2BIG == errno) {
cerr << "There is not sufficient room at *outbuf." << endl;
}
else if (EILSEQ == errno) {
cerr << "An invalid multibyte sequence has been encountered in the input." << endl;
}
else if (EINVAL == errno) {
cerr << "An incomplete multibyte sequence has been encountered in the input." << endl;
}
goto TestFinished;
}
else {
outsave = 64 - outsize;
memcpy(save, outptr - outsave, outsave); // 此处采用memcpy而不采用strcpy的目的是,当ACSII类型字符转换到UCS2类型时,会产生0x00的字符,使用strcpy复制会在此处截断,导致内容丢失
}
cout << "successed." << endl;
TestFinished:
delete[] inbuff;
delete[] outbuff;
delete[] save;
iconv_close(cd);
getchar();
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/234978.html原文链接:https://javaforall.cn