vs2010上中文显示乱码问题

来源:互联网 发布:大数据的主要应用领域 编辑:程序博客网 时间:2024/06/11 01:35

转载自 http://blog.sina.com.cn/s/blog_afb179310102v0pr.html



常见的字符编码有:

1.ASCII码是单字节编码,编码范围是0x00-0x7F(最高位保持为0)ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0x00-0x200x7F33个控制字符,只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。

2.GB2312 是对 ASCII的中文扩展,正式的名称为MBCSMulti-ByteChactacter System,多字节字符系统)按照程序员的称呼,GB2312GBKGB18030都属于双字节字符集(DBCS)
规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA10xFE,这样我们就可以组合出大约7000多个简体汉字了

3.Unicode,unicode是全世界统一的编码规则,但是这个只规定了各种字符的数字编码(相当于一种标准),具体实现的存储方式有utff-8,utf-16,utf-32等形式。各种形式有不同的存储和与unicode代码的映射规则。

现在大部分具有国际化特征的软件核心字符处理都是以Unicode为基础的,在软件运行时根据当时的Locale/Lang/Codepage设置确定相应的本地字符编码设置,并依此处理本地字符。在处理过程中需要实现Unicode和本地字符集的相互转换,甚或以Unicode 为中间的两个不同本地字符集的相互转换。这种方式在网络环境下被进一步延伸,任何网络两端的字符信息也需要根据字符集的设置转换成可接受的内容。

 

通常android手机和ipone手机上显示中文采用的编码是UnicodeUTF-8带签名)

所以要想中文字体在手机上面显示需要把字符设置成UnicodeUTF-8带签名),方法如下(vs2010):

1.选中字符所在的文件,

2,选择文件菜单

3.选择高级保存选项,然后可以设置该文件的字符编码了。

 

如果把字符编码设置成 UnicodeUTF-8带签名),那么在vs2010中运行游戏,发现中文显示乱码了

为什么?那是因为vs2010用的编码方式是GB2321,这时我们需要把Unicode编码转换成为GB2312编码

 怎么呢,首先:定义wstring或者wchar_t,比如:staticconst wstring W_GAMEOVER_TITLE = L"数据统计";
static const wchar_t* W_KILL_LABEL = L"本局杀死敌人数:%d";

注意:wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码。unicode编码的字符一般以wchar_t类型存储。

voidConvertGBKToUtf8(CString& strGBK) {
    intlen=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1,NULL,0);
    unsignedshort * wszUtf8 = new unsigned short[len+1];
    memset(wszUtf8,0, len * 2 + 2);
    MultiByteToWideChar(CP_ACP,0, (LPCTSTR)strGBK, -1, wszUtf8, len);

    len= WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL,NULL); 
    char*szUtf8=new char[len + 1];
    memset(szUtf8,0, len + 1);
    WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

    strGBK= szUtf8;
    delete[]szUtf8;
    delete[]wszUtf8;
}

voidConvertUtf8ToGBK(CString& strUtf8) {
    intlen=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1,NULL,0);
    unsignedshort * wszGBK = new unsigned short[len+1];
    memset(wszGBK,0, len * 2 + 2);
    MultiByteToWideChar(CP_UTF8,0, (LPCTSTR)strUtf8, -1, wszGBK, len);

    len= WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL,NULL); 
    char*szGBK=new char[len + 1];
    memset(szGBK,0, len + 1);
    WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);

    strUtf8= szGBK;
    delete[]szGBK;
    delete[]wszGBK;
}

原创粉丝点击