linux中使用libiconv库中的iconv()函数将UTF_8编码转换成UTF-16BE编码失败遇到的坑
-
在使用Iiconv()转换UTF-8编码为UTF-16编码的时候发现
int result = iconv(cd, &bufferStart, &inLen, &convertedStart, &outLen);调用接口函数返回result 的值总是-1无法转换失败。原因是因为outlen长度的不足。因为开始赋值inleN=outlen,导致长度存在问题。- 经过调试发现此问题,通过调试的代码如下所示。
#include<iostream>
#include<cstdio>
#include<string>
#include<iconv.h>
#include<cstring>
#include <errno.h>
#include <stdlib.h>
using namespace std;
static string ConvertUTF82UTF16( string & sourceStr)
{
if (sourceStr.size() == 0)
{
return "";
}
size_t inLen = sourceStr.size();
size_t outLen = inLen*2;
cout<<"string ConvertUTF82UTF16 size :"<<inLen<<endl;
char *buffer = (char *)malloc(sizeof(char) * inLen);
char *bufferStart = buffer;
char *convertedBuffer = (char *)malloc(sizeof(char) * outLen);
char *convertedStart = convertedBuffer;
std::string ret("");
memset(convertedBuffer, 0, outLen);
memcpy(buffer, sourceStr.c_str(), inLen);
iconv_t cd = iconv_open("UTF-16BE", "UTF-8");
if (cd == NULL)
{
fputs("Open conv error!", stderr);
}
else
{
int result = iconv(cd, &bufferStart, &inLen, &convertedStart, &outLen);
if (result == -1)
{
fputs("Conv error! ", stderr);
}
cout<<"result value :"<<result<<endl;
cout<<"convertedBuffer string :"<<convertedBuffer<<endl;
iconv_close(cd);
ret.assign(convertedBuffer, sourceStr.size()*2);
}
free(buffer);
free(convertedBuffer);
return ret;
}
static string ConvertUTF162UTF8( string & sourceStr)
{
if (sourceStr.size() == 0)
{
return "";
}
size_t inLen = sourceStr.size(), outLen = inLen;
cout<<"string ConvertUTF162UTF8 size :"<<inLen<<endl;
cout<<"string outLen size :"<<outLen<<endl;
char *buffer = (char *)malloc(sizeof(char) * inLen);
char *bufferStart = buffer;
char *convertedBuffer = (char *)malloc(sizeof(char) * outLen);
char *convertedStart = convertedBuffer;
std::string ret("");
memset(convertedBuffer, 0, outLen);
memcpy(buffer, sourceStr.c_str(), inLen);
iconv_t cd = iconv_open("UTF-8", "UTF-16BE");
if (cd == NULL)
{
fputs("Open conv error!", stderr);
}
else
{
int result = iconv(cd, &buffer, &inLen, &convertedBuffer, &outLen);
cout<<"string outLen2 size :"<<outLen<<endl;
if (result == -1)
{
fputs("Conv error! ", stderr);
}
iconv_close(cd);
//ret.assign(convertedStart, sourceStr.size() - outLen);
ret.assign(convertedStart);
}
// free(bufferStart);
free(buffer);
//free(convertedStart);
free(convertedBuffer) ;
return ret;
}
int main()
{
string source ("测试test01~");
string result;
string Utf8Result;
cout<<"source string : "<< source<<endl;
result=ConvertUTF82UTF16( source);
cout <<"result string :"<<result<<endl;
Utf8Result=ConvertUTF162UTF8(result);
cout <<"Utf8Result string :"<<Utf8Result<<endl;
}