`
ijavagos
  • 浏览: 1183262 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

J# 
阅读更多
字符集之间转换(UTF-8,UNICODE,Gb2312)
特搜集了UTF-8,UNICODE,Gb2312他们3个之间的相互转换.
UTF-8: 1~3字节可变
UNICODE: 2字节一个字符
GB2312: 2字节一个字符
例子: “你”字的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[i] > 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转换 gb2312转换 unicode 转转

    汉字编码转换工具,实现了汉字与 utf-8 gb2312 unicode 互转,开发者多百多度 qq:547170882

    字符集Unicode与UTF-8之间的转换

    [字符集]Unicode和UTF-8之间的转换详解

    UNICODE与UTF-8转换

    将UNICODE字符集与UTF-8字符集相互转换

    pb9.0 UTF-8 编码转换为Unicode 编码格式

    PowerBuilder9.0开发环境下,可以把UTF-8的编码转换为Unicode的编码格式,在pb9.0环境下测试通过。

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

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

    PHP如何实现Unicode和Utf-8编码相互转换

    Unicode是一个字符集,而UTF-8是Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1个字节。Unicode为双字节,而UTF-8中汉字占三个字节。 UTF-8...

    unicode编码(UTF8)的十六进制 与字符 互相转换

    编码包含的是中文,英文,俄文还是日文什么的,只要把它转换成Unicode就能被识别,而不用再考虑其他字符集的问题,UTF8是Unicode得一种实现方式。 unicode编码(UTF8)的十六进制 与字符 互相转换

    文本文件编码转换工具 gbk utf8 gb2312

    -----MySQL 字符集: UTF-8 Unicode (utf8) -----&gt; 2)建表时候一切默认;至于导入*.SQL没试应该是不用动什么&lt;!-----MySQL 字符集: UTF-8 Unicode (utf8) -----&gt; 3)在 php 文件头部加入 &lt;meta http-equiv="Content-...

    C语言UTF8到ANSI和Unicode转换代码

    使用C语言,实现UTF8、Unicode、ANSI字符集的互转,用C语言实现头文件和源文件,引入工程可以直接使用。如果在MFC项目中使用该代码,需要更改配置,压缩包中有详细说明。

    C# 制作UTF8 到 GB2312的代码

    一个简单的转换工具,对某一个目录中的utf-8文件进行转换;您也可以利用这个原理进行其他编码的转换,例如utf-8到unicode. 注意:使用的是C#自带的字符集转换功能.本人不了解utf-8的等编码原理.

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

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

    通过javascript进行UTF-8编码的实现方法

    javascript的字符集: javascript程序是使用Unicode字符集编写的。...UTF-8(UTF8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。 它可以用来表示Unicode标准中的任何字

    PHP 与 UTF-8 的最佳实践详细介绍

    PHP 语言层面是不支持 Unicode字符集的,但是可以通过 UTF-8 编码能处理大部分问题。 最佳实践就是明确知道输入编码(不知道就检测),内部统一转换为 UTF-8 编码,输出编码也统一是 UTF-8编码。 PHP 层面如何处理 ...

    vs打开vc工程后unicode字符串替换

    当vs2013只支持unicode字符集,打开vc6.0版本的工程后,需要把字符串的形式从 "aaa" 转换成 _T("aaa"),手工转换工作量大,本程序可实现批量转换,操作方法是将原文件内容复制过来,点击转换按钮,然后再复制回去即可...

    Encoding

    big5,Unicode,GBK之间的相互转换,前提是只转换共同的字符集部分, 使用说明: 暂时程序支持以下字符编码方式: GBK,BIG5,UTF-16BE(Unicode big-endian字节顺序),UTF-16LE(Unicode little-endian字节顺序),UTF-8 ...

    用javascript实现gb2312转utf-8的脚本

    信息交换用汉字编码字符集-基本集 汉字标准交换码共分两级。第一级为常用字,有3755字,按汉语拼音字母顺序排列,第二级为次常用字,有3008字,按部首排列。GB2312的编码范围为2121H-777EH. UNICODE 是两字节的全...

    MySQL字符集 GBK、GB2312、UTF8区别 解决MYSQL中文乱码问题

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的。 character-set-database:数据库字符集。 character-set-table:数据库表字符集。 优先级依次增加。所以...

    让开源项目TinyXml支持Unicode(wchar_t)

    开源项目TinyXml项目所涉及的字符编码说明... - 新增适用于`宽字符`参数的函数接口,调用字符集转换功能,转换为`窄字符`参数,再回调TinyXml原版接口。 - 对于以UTF16编码、或UTF32编码的Xml字符串,转换为UTF8编 --

    GB18030编码 - 副本.txt

    GBK 汉字内码扩展规范编码表 GBK编码是GB2312编码的超集,向下完全兼容GB2312。 GB18030编码向下兼容GBK和GB2312, ...GBK,GB2312以及Unicode都既是字符集,也是编码方式,而UTF-8只是编码方式,并不是字符集

    详谈PHP编码转换问题

    Unicode是一个字符集,而UTF-8是Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1个字节。Unicode为双字节,而UTF-8中汉字占三个字节。 UTF-8...

Global site tag (gtag.js) - Google Analytics