`
hcmfys
  • 浏览: 362154 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

字符集之间转换(UTF-8,UNICODE,Gb2312) c++

阅读更多
UTF-8:   3字节一个字符
UNICODE: 2字节一个字符
GB2312:  1字节一个字符

例子:

“你”字的UTF-8编码: E4 BD A0        11100100 10111101 10100000
“你”的Unicode编码: 4F 60            01001111 01100000
按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000
把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。
注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。
经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。

类定义
class CChineseCode
{
   public:
       static void UTF_8ToUnicode(wchar_t* pOut,char *pText);  // 把UTF-8转换成Unicode
       static void UnicodeToUTF_8(char* pOut,wchar_t* pText);  //Unicode 转换成UTF-8
       static void UnicodeToGB2312(char* pOut,wchar_t uData);  // 把Unicode 转换成 GB2312
       static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成 Unicode
       static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);//GB2312 转为 UTF-8
       static void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//UTF-8 转为 GB2312
};

类实现

void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText)
{
    char* uchar = (char *)pOut;

    uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
    uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);

    return;
}

void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText)
{
    // 注意 WCHAR高低字的顺序,低字节在前,高字节在后
    char* pchar = (char *)pText;

    pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
    pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
    pOut[2] = (0x80 | (pchar[0] & 0x3F));

    return;
}

void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData)
{
    WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL);
    return;
}    

void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)
{
    ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
    return ;
}

void CChineseCode::GB2312ToUTF_8(string& pOut,char *pText, int pLen)
{
    char buf[4];
    int nLength = pLen* 3;
    char* rst = new char[nLength];
   
    memset(buf,0,4);
    memset(rst,0,nLength);
   
    int i = 0;
    int j = 0;     
    while(i < pLen)
    {
            //如果是英文直接复制就能
            if( *(pText + i) >= 0)
            {
                    rst[j++] = pText[i++];
            }
            else
            {
                    wchar_t pbuffer;
                    Gb2312ToUnicode(&pbuffer,pText+i);
                    
                    UnicodeToUTF_8(buf,&pbuffer);
                    
                    unsigned short int tmp = 0;
                    tmp = rst[j] = buf[0];
                    tmp = rst[j+1] = buf[1];
                    tmp = rst[j+2] = buf[2];    
                    
                    j += 3;
                    i += 2;
            }
    }
    rst[j] = ’’;

    //返回结果
    pOut = rst;             
    delete []rst;  
   
    return;
}

void CChineseCode::UTF_8ToGB2312(string &pOut, char *pText, int pLen)
{
    char * newBuf = new char[pLen];
    char Ctemp[4];
    memset(Ctemp,0,4);

    int i =0;
    int j = 0;
   
    while(i < pLen)
    {
        if(pText > 0)
        {
                newBuf[j++] = pText[i++];                      
        }
        else                
        {
                WCHAR Wtemp;
                UTF_8ToUnicode(&Wtemp,pText + i);
        
                UnicodeToGB2312(Ctemp,Wtemp);
           
                newBuf[j] = Ctemp[0];
                newBuf[j + 1] = Ctemp[1];

                i += 3;    
                j += 2;  
        }
    }
    newBuf[j] = ’’;
   
    pOut = newBuf;
    delete []newBuf;
   
    return;
}  
分享到:
评论

相关推荐

    UTF-8 Unicode GBK GB2312 编码之间的区别和联系

    - **转换路径**:GBK、GB2312与UTF-8之间的转换必须通过Unicode编码来进行。 - **GBK、GB2312 → Unicode → UTF-8** - **UTF-8 → Unicode → GBK、GB2312** - **示例**:假设一个汉字在GBK中的编码为`b030`,其...

    UTF-8与GB2312文件编码转换(支持批量文件)

    这个工具,基于Qt5.9框架开发,专门用于UTF-8与GB2312编码之间的批量转换,为用户提供了方便。 首先,我们来了解UTF-8编码。UTF-8是一种变长的Unicode编码方式,它可以表示Unicode字符集中所有的字符。每个Unicode...

    UTF-8与GB2312之间的互换类.rar_ UTF-8toGB2312_UTF-8 GB2312_gb2312_mmi_ch

    标题中的"UTF-8与GB2312之间的互换类.rar_ UTF-8toGB2312_UTF-8 GB2312_gb2312_mmi_ch"指的是一个能够帮助开发者在UTF-8和GB2312两种编码格式之间进行转换的程序类库。这个压缩包可能包含了源代码文件,使得用户可以...

    汉字编码转换工具(汉字与utf-8转换 gb2312转换 unicode 转转

    此工具支持的关键编码格式包括UTF-8、GB2312以及Unicode。 1. UTF-8编码:UTF-8(8位 Unicode 转换格式)是一种变长的字符编码,它能够表示Unicode字符集中的所有字符。UTF-8最吸引人的特点是其对英文字符使用单...

    C++ UTF-8与 Unicode互相转换.docx

    本文将详细探讨C++中如何进行UTF-8与Unicode之间的转换,以及涉及的相关知识。 首先,我们要了解UTF-8和Unicode的基本概念。Unicode是一个通用的字符集,它包含世界上几乎所有的文字和符号,每个字符都有一个唯一的...

    多字节与UTF-8、Unicode之间的转换

    ### 多字节与UTF-8、Unicode之间的转换 在计算机科学领域,字符编码是将文字映射到二进制数据的一种方式。不同的字符编码方案适用于不同的应用场景。本篇文章主要探讨的是多字节(MBCS)编码与UTF-8、Unicode编码...

    UTF-8与GB2312之间的互换.doc

    相反的过程,即从GB2312编码的文本转换到UTF-8,也需要先将GB2312解码为Unicode,然后从Unicode编码到UTF-8。这可以通过调用`MultiByteToWideChar`函数,同样设置`CodePage`参数为936,之后再使用相应的函数将...

    utf-8.rar_c++ string utf-8_string to utf-8_utf_utf 8_utf-8

    如果需要处理UTF-8编码,可能需要额外的库支持,如Boost.Locale或者ICU库,这些库提供了对多字节字符集(包括UTF-8)的支持。 转换`std::string`到UTF-8通常不是必要的,因为`std::string`默认就可以存储UTF-8编码...

    C++写的Windows下GB2312与UTF-8相互转换代码.rar

    前者用于将多字节字符集(如GB2312)转换为宽字符集(UTF-16,Windows内部使用),后者则将宽字符集转换为多字节字符集(可以是UTF-8或其他编码)。 `ChineseCode.cpp`可能包含了具体的转换函数实现,这些函数通常...

    GBK与UTF-8转码(C++)

    - **UTF-8**:即“Unicode Transformation Format - 8 bits”,是一种可变长度的字符编码方式,用于表示Unicode字符集。UTF-8编码最大的优点在于兼容ASCII,并且对于英文等拉丁语系的文字占用较少空间,因此被广泛...

    win32下UTF-8转GB2312代码

    以下代码示例展示了如何使用MFC的`MultiByteToWideChar`函数将UTF-8编码的字符串转换为Unicode,再通过`WideCharToMultiByte`函数将其转换为GB2312编码。 ```cpp CString UTF8ToGB2312(const char* utf8Str) { int...

    Linux下实现UTF-8和GB2312互相转换的方法

    本文详细介绍了在Linux环境下实现UTF-8和GB2312两种字符集之间互相转换的方法,通过提供的代码示例可以帮助开发者更好地理解和实现字符集转换功能。这对于跨平台或多语言环境的应用开发尤为重要。

    UTF-8.rar_utf_utf gb2312_utf 转换_utf-8_utf-8解码

    本文将深入探讨UTF-8和GB2312这两种字符编码,并解释它们之间的转换过程以及相关的解码技术。 首先,UTF-8是一种广泛使用的Unicode字符编码方式。它能够表示Unicode字符集中所有的字符,包括汉字、拉丁字母、希腊...

    MFC UTF-8文件批量转成GB2312 解决中文乱码问题

    这个过程中的关键在于正确地处理各种编码之间的转换,尤其是从UTF-8到GB2312的转换,因为这两种编码的字节顺序和字节数是不同的。在实际操作中,还需要考虑文件名的编码,因为Windows系统允许文件名使用多种编码,这...

    pb调用外部函数进行字符集转换.zip

    本压缩包“pb调用外部函数进行字符集转换.zip”提供了一些方法来实现UTF-8、GB2312和CP936之间的转换。以下是对这些转换操作的详细解释: 1. **UTF-8转GB2312**: UTF-8是一种可变长度的Unicode编码,广泛用于网络...

    UTF-8 UNICODE GBK 相互转换C源码

    3. UTF-8 to GBK:由于GBK字符集不包含所有Unicode字符,因此这个转换可能需要处理无法映射的字符。通常,这些字符会被替换为替代字符或者抛出错误。 4. GBK to UTF-8:与UTF-8到GBK的转换类似,GBK字符到UTF-8的...

    C++ 实现unicode到utf-8的转码

    Unicode是一种通用的字符集,它包含了世界上几乎所有的字符和符号,而UTF-8是Unicode的一种广泛使用的编码方式。 Unicode是一个标准化的编码系统,其目标是为所有已知的字符提供一个唯一的数字表示,称为码点(Code...

    C++ 汉字UTF-8字符串处理类库

    很多人喜欢用CString 或std:string,但是他们的缺点是不能完成汉字各种类型之间的转换,提供三种类库ascString,ucsString,utfString以及工具utfCount,utf8_ucs2_t,tcf8_ucs4_t类库,用于各种字符串之间的直接转换`...

    C++使用WideCharToMultiByte函数生成UTF-8编码文件的方法

    WideCharToMultiByte函数是Windows API提供的一种方法,用于将Unicode字符串转换为特定的多字节字符集,包括UTF-8。以下是关于这个函数的详细解释和使用步骤。 **WideCharToMultiByte函数详解** 函数原型: ```cpp...

    c/c++ 字符集 gbk/utf8互转,Ansi/Utf8互转 纯c实现跨平台

    本文将深入探讨C/C++中GBK/UTF-8以及ANSI/UTF-8字符集的转换,以及如何通过纯C代码实现这些转换,确保程序在Windows和Linux等不同操作系统上的一致性。 首先,我们需要理解字符集的基础知识。ASCII是最基础的字符集...

Global site tag (gtag.js) - Google Analytics