`
hcmfys
  • 浏览: 347024 次
  • 性别: 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;
}  
分享到:
评论

相关推荐

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

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

    记事本软件 还原 可以高亮显示各种语法 自定义语法高亮 支持ANSI,Unicode,UTF-8等编码互换

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对...

    VC/C++ 字符编码格式转换

    通过调用封装API函数WideCharToMultiByte和MultiByteToWideChar,实现ANSI/UTF-8/Unicode编码格式的相互转换。有C++和C两个版本。

    任意长度GBK-UTF8文本文件转换程序

    本程序可以将任意长度使用GBK字符集的文本文件,转换为UTF8字符集的文本文件,当然经过修改,也可以转换成为Unicode字符集的文本文件。程序为控制台程序,已经在vc++ 6.0下编译通过。

    Notepad2源码

    具有显示行号、内建各种程序语法的高亮度显示、支持 Unicode 与 UTF-8 的功能。最重要的是他具有一般文书编辑软件所没有的「行列功能」,可以进行区块模式选取的编辑。绝对是程序设计师的好帮手。 1 自定义语法...

    <编程高亮文本编辑器>Notepad2改良版(修复特殊字符崩溃BUG)

    具有显示行号、内建各种程序语法的高亮度显示、支持 Unicode 与 UTF-8 的功能。最重要的是他具有一般文书编辑软件所没有的「行列功能」,可以进行区块模式选取的编辑。绝对是程序设计师的好帮手。 这是一个很不错的...

    ASP高亮记事本Notepad2 V4.0.22-Final绿色汉化增强版

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对显示...

    Notepad2 V4.2.25

    具有显示行号、内建各种程序语法的高亮度显示、支持 Unicode 与 UTF-8 的功能。最重要的是他具有一般文书编辑软件所没有的「行列功能」,可以进行区块模式选取的编辑。绝对是程序设计师的好帮手。 这是一个很不错的...

    Notepad2 V2.0.19 绿色汉化版_类似系统记事本的文本编辑工具

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕...

    Notepad2 v4.1.24 和 Notepad++ 6.1.5

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对...

    notepad2beta4.zip

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对...

    notepad2 记事本2汉化版

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对...

    一个很不错的记事本软件 Notepad2中文版

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对显示...

    Notepad2.exe

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对显示...

    notepad2_cn

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对显示...

    高级记事本....Notepad2

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对...

    notepad2 超级给力的代码编辑器

     2 支持ANSI,Unicode,UTF-8等编码互换  3 可以设置无限个书签(9种图标可换)轻松定位  4 空格,制表符彩色显示,并可互相转换  5 可以对任意的文本块进行操作,ALT键+鼠标  6 对括号{}〔〕()可以高亮配对...

    Notepad2_v4.1.24简体中文版(Windows7)

    2 支持ANSI,Unicode,UTF-8等编码互换 3 可以设置无限个书签(9种图标可换)轻松定位 4 空格,制表符彩色显示,并可互相转换 5 可以对任意的文本块进行操作,ALT键+鼠标 6 对括号{}〔〕()可以高亮配对显示...

    Tinyxml 源代码(VC6 & VS2005)

    TinyXML完全支持UTF-8编码和前64k个字符实体(译注:如果你不明白这句译文,可能你需要了解一下Unicode编码)。 它无法做些什么 TinyXML不解析不使用DTDs(文档类型定义)或者XSLs(可扩展样式表语言)。有其它...

Global site tag (gtag.js) - Google Analytics