linux中使用libiconv库中的iconv()函数将UTF

it2025-03-30  8

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; }
最新回复(0)