linux中使用libiconv库中的iconv()函数将UTF_8编码转换成UTF-16BE编码失败遇到的坑

linux中使用libiconv库中的iconv()函数将UTF_8编码转换成UTF-16BE编码失败遇到的坑

  1. 在使用Iiconv()转换UTF-8编码为UTF-16编码的时候发现
    int result = iconv(cd, &bufferStart, &inLen, &convertedStart, &outLen);调用接口函数返回result 的值总是-1无法转换失败。原因是因为outlen长度的不足。因为开始赋值inleN=outlen,导致长度存在问题。

    1. 经过调试发现此问题,通过调试的代码如下所示。
#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;


    
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值