VC判断UTF-8与ANSI

大家知道,如果只有英文的话,UTF-8与ANSI是一样的
但有了中文以后,情况就很不一样了,
在ANSI中,比如GBK,中文占两字节,
在UTF-8中,中文占三字节,
当中英文混合时,情况就更复杂一些了。
下面一段是在以前项目中,先判断是UTF-8还是GBK然后转为UNICODE的代码

//要判断内容
char *s1="....";
//字符编码
UINT CodePage=0;
//字符串长度
int nLen=strlen(s1);

//判断是否为UTF-8
//至少要3字节
if(nLen>=3)
{
    unsigned char U1,U2,U3;
    int nNow=0;
    while(nNow<nLen)
    {
        U1=(unsigned)s1&#91;nNow&#93;;
        if((U1&0x80)==0x80)
        {
            //中文字符,则要三个字符
            if(nLen>nNow+2)
            {
                U2=(unsigned)s1[nNow+1];
                U3=(unsigned)s1[nNow+2];
                //中文三字节为0xE0 0xC0 0xC0
                if(((U1&0xE0)==0XE0) && ((U2&0xC0)==0x80) && ((U3&0xC0)==0x80))
                {
                    //有可能是UTF-8
                    CodePage=65001;
                    nNow=nNow+3;
                }
                else
                {
                    //不是UTF-8
                    CodePage=0;
                    break;
                }
            }
            else
            {
                //不是UTF-8
                CodePage=0;
                break;
            }
        }
        else
        {
            //非中文字符
            nNow++;
        }
    }
}

DWORD dwNum;
dwNum=MultiByteToWideChar(CodePage,0,s1,-1,NULL,0);
if(dwNum)
{
    wchar_t *pwText;
    pwText=new TCHAR[dwNum];
    if(pwText)
    {
        MultiByteToWideChar(CodePage,0,s1,-1,pwText,dwNum);
    }
    szPatientName=pwText;
    delete []pwText;
}

Leave a Reply

Your email address will not be published. Required fields are marked *

*