AKever

导航

C++(1) 数据编码格式转换(中文乱码)UTF8ToGBK

数据编码格式转换(中文乱码)UTF8ToGBK(适用于VC++,引用了cstring.h)

工具类 UTF8ToGBK.h/cpp

UTF8ToGBK.h

#pragma once

#include <iostream>
#include <stdio.h>
//string是c++ 的头文件,其内包含了一个string类,string s1就是建立一个string类的对象 
#include <string>
//cstring.h 是对应于旧C 头文件的std 版本
#include <cstringt.h>
#include <locale>

#define LOGNEWLINE printf("\n")
using namespace std;

class UTF8ToGBK
{
public:
    UTF8ToGBK(void);
    ~UTF8ToGBK(void);

    //将unicode编码的string转换成wstring
    static wstring stringToWstring(const string text);
    //将utf8格式编码转化成gbk,vs2010的默认的编码格式
    static string UTF8TOGBK(const string text);
};

UTF8ToGBK.cpp

#include "UTF8ToGBK.h"


UTF8ToGBK::UTF8ToGBK(void)
{
}


UTF8ToGBK::~UTF8ToGBK(void)
{
}


//将string转换成wstring
wstring UTF8ToGBK::stringToWstring(const string str)
{

    setlocale(LC_ALL, "chs"); 
    const char* _Source = str.c_str();
    size_t _Dsize = str.size() + 1;
    wchar_t *_Dest = new wchar_t[_Dsize];
    wmemset(_Dest, 0, _Dsize);
    mbstowcs(_Dest,_Source,_Dsize);
    std::wstring result = _Dest;
    delete []_Dest;
    setlocale(LC_ALL, "C");
    return result;

}

//当在WIN32 平台下,将utf8格式编码转化成gbk,vs2010的默认的编码格式
string UTF8ToGBK::UTF8TOGBK(const string text)
{

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)


    wstring tes = stringToWstring(text);
    
    int asciSize = WideCharToMultiByte(CP_UTF8,0,tes.c_str(),tes.size(),NULL,0,NULL,NULL);
    if (asciSize == ERROR_NO_UNICODE_TRANSLATION || asciSize == 0)    
    {
        return string();
    }

    char *resultString = new char[asciSize];
    int conveResult = WideCharToMultiByte(CP_UTF8,0,tes.c_str(),tes.size(),resultString,asciSize,NULL,NULL);
    if (conveResult != asciSize)
    {
        return string();
    }
    string buffer = "";
    buffer.append(resultString,asciSize);

    delete[] resultString;
    return buffer;


#endif

    return text;

}

测试调用:

    string s_data = "可以";
    string s_changedData = UTF8ToGBK::UTF8TOGBK(s_data);  

 

posted on 2014-01-23 08:59  AKever  阅读(2775)  评论(0)    收藏  举报