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;
}

cpp中删除一个静态局部变量?

大家都知道,static变量,内容在堆中分配的,new来的对象也是堆中分配的,
那么,如果在cpp中删除一个静态局部变量,后果是什么?
编译错误?还是运行错误?
比如下面的aTest函数,能运行吗?

#include <iostream>
using namespace std;

int aTest()
{
	static int a=0;
	int *b=&a;
	delete b;
	return a++;
}

int main(int argc,char** argv)
{
	for(int i=0;i<100;i++)
	{
		cout<<aTest()<<endl;
	}
	return 0;
}

事实是,
在gcc下,无论debug还是release,都没有问题,
在vc下,debug会报assert错误,release没有问题。
那cpp下,内存管理是谁做的?编译器为什么让它过去了呢?
其实,个人感觉,也就是上面的内存操作并不多,复杂情况下,早就挂了。

一个有趣的VC6题目

在VC6 Debug环境下,要求填补一段代码,使输入与输出一致。

    #Include <Stdio.h>  
    void test()  
    {  
        int t;  
        scanf("%d", &t);  
       /*  
       在这里填写代码…… 
       */  
    }  
    int main()  
    {  
        int m;  
        test();  
        printf("%d", m);  
    }  

方法一:

    int* pt = &t;  
    pt += 22;  
    *pt = t  

方法二:

    #Include <windows.h>  
    DWORD addrEbp;  
    _asm  
    {  
        mov addrEbp,ebp;  
    }  
    DWORD *pm=(DWORD *)(addrEbp + 0x80-0x28 -4);  
    *pm=t;  

两种方法都是直接修改了内存,呵呵,还是蛮有意思的啦。