mfc 按钮上乱码问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mfc 按钮上乱码问题相关的知识,希望对你有一定的参考价值。

在图片按钮上显示匈牙利语时,会出现乱码。
目前的实现方式是在 PUSHBUTTON "Frissítés",IDC_BTN_UPDATE,173,96,69,25,WS_DISABLED
,也就是说直接将文字拷贝到代码当中,当中的特殊字符íté会显示成乱码。但是这个string 在其他空间上显示为正确的字符。

建议:
工程使用Unicode编码方式编译。
使用Unicode编码的好处
使用Unicode编码可以使您的工程同时支持多种语言,使您的工程国际化。
另外,Windows NT是使用Unicode进行开发的,整个系统都是基于Unicode的。如果调用一个API函数并给它传递一个ANSI(ASCII字符集以及由此派生并兼容的字符集,如:GB2312,通常称为ANSI字符集)字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给您的应用程序。进行这些字符串的转换需要占用系统的时间和内存。如果用Unicode来开发应用程序,就能够使您的应用程序更加有效地运行。

VC++6.0中编写Unicode编码的应用程序
VC++ 6.0支持Unicode编程,但默认的是ANSI,所以开发人员只需要稍微改变一下编写代码的习惯便可以轻松编写支持UNICODE的应用程序。
使用VC++ 6.0进行Unicode编程主要做以下几项工作:
1、为工程添加UNICODE和_UNICODE预处理选项。
具体步骤:打开[工程]->[设置…]对话框,在C/C++标签对话框的“预处理程序定义”中去除_MBCS,加上_UNICODE,UNICODE。(注意中间用逗号隔开)
在没有定义UNICODE和_UNICODE时,所有函数和类型都默认使用ANSI的版本;在定义了UNICODE和_UNICODE之后,所有的MFC类和Windows API都变成了宽字节版本了。

2、设置程序入口点
因为MFC应用程序有针对Unicode专用的程序入口点,我们要设置entry point。否则就会出现连接错误。
设置entry point的方法是:打开[工程]->[设置…]对话框,在Link页的Output类别的Entry Point里填上wWinMainCRTStartup。
3、使用ANSI/Unicode通用数据类型
微软提供了一些ANSI和Unicode兼容的通用数据类型,我们最常用的数据类型有_T ,TCHAR,LPTSTR,LPCTSTR。
顺便说一下,LPCTSTR和const TCHAR*是完全等同的。其中L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的,在Win32 中以及其它的32位操作系统中,long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。P(pointer)表示这是一个指针;C(const)表示是一个常量;T(_T宏)表示兼容ANSI和Unicode,STR(string)表示这个变量是一个字符串。综上可以看出,LPCTSTR表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。比如:
TCHAR* szText=_T(“Hello!”);
TCHAR szText[]=_T(“I Love You”);
LPCTSTR lpszText=_T(“大家好!”);

使用函数中的参数最好也要有变化,比如:MessageBox(_T(“你好”));

其实,在上面的语句中,即使您不加_T宏,MessageBox函数也会自动把“你好”字符串进行强制转换。但我还是推荐您使用_T宏,以表示您有Unicode编码意识。
4、修改字符串运算问题
一些字符串操作函数需要获取字符串的字符数(sizeof(szBuffer)/sizeof(TCHAR)),而另一些函数可能需要获取字符串的字节数sizeof(szBuffer)。您应该注意该问题并仔细分析字符串操作函数,以确定能够得到正确的结果。
ANSI操作函数以str开头,如strcpy(),strcat(),strlen();
Unicode操作函数以wcs开头,如wcscpy,wcscpy(),wcslen();
ANSI/Unicode操作函数以_tcs开头 _tcscpy(C运行期库);
ANSI/Unicode操作函数以lstr开头 lstrcpy(Windows函数);
考虑ANSI和Unicode的兼容,我们需要使用以_tcs开头或lstr开头的通用字符串操作函数。
参考技术A 多国语言,在VC较低版本(如VC6)中兼容不好,尤其在代码编辑器中,乱码几乎是必然的。
比较安全的办法:
创建多国语言资源字符串。如果所有界面都是匈牙利语,那么将整个资源右键属性,设置语言,选择匈牙利。
使用中,如果代码需要字符串,那么需要LoadString(IDS_XXXX),资源中可以正常使用(前提是语言和资源设置保持一致)追问

看到你的回答很有兴趣,我vc学的不是很深入,你可以不可以发个简单的例程给我吗??非常谢谢。

MFC中解决文本保存到文件时乱码问题

 

在高版本的VS中,若直接将CString保存到文本文件中,可能会出现乱码问题

原因就在于项目的编码跟系统的默认编码不同(Unicode和GB2312),这个时候使用如下代码,即可解决。

unsigned char CharSet[2]; //写入文件字符编码(UTF)

CharSet[0]=0xFF;
CharSet[1]=0xFE;

InFile.Write(CharSet,sizeof(CharSet));

到这里呢,可以解决乱码的问题,但是,很可能出现内容只剩下一半的情况,那是因为CFile是面向字节的,大小是以字节为单位,但是CString是以双字节为单位(Unicode),此时可以使用如下代码解决
InFile.Write(FileContent,FileContent.GetLength()*2);
//默认Unicode,转换为Byte时乘以2

 

以上是关于mfc 按钮上乱码问题的主要内容,如果未能解决你的问题,请参考以下文章

MFC中解决文本保存到文件时乱码问题

mfc 弹出对话框 类似韩文乱码

MFC 保存文件到txt 乱码问题,求助谢谢nmoh

MFC中输出String类型(内容为01串)出现乱码

MFC chartDirector6.0 中文是乱码,求C++解决方案,使用的是VS2010

eclipse中文乱码怎么解决