关于在VC6.0中打开Unicode文本文件

关于在VC6.0中打开Unicode文本文件,第1张

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开头的通用字符串 *** 作函数。

六、举个Unicode编程的例子

第一步:

打开VC++6.0,新建基于对话框的工程Unicode,主对话框IDD_UNICODE_DIALOG中加入一个按钮控件,双击该控件并添加该控件的响应函数:

void CUnicodeDlg::OnButtonUnicode() { TCHAR* str1=_T("ANSI和UNICODE编码试验")m_disp=str1UpdateData(FALSE)}

添加静态文本框IDC_DISP,使用ClassWizard给该控件添加CString类型变量m_disp。使用默认ANSI编码环境编译该工程,生成Unicode.exe。

第二步:修改系统内码

打开“控制面板”,单击“日期、时间、语言和区域设置”选项,在“日期、时间、语言和区域设置”窗口中继续单击“区域和语言选项”选项,d出“区域和语言选项”对话框。在该对话框中,单击“高级”标签,将“非Unicode的程序的语言”选项改为“日语”,单击“应用”按钮,

d出的对话框单击“是”,重新启动计算机使设置生效。

运行Unicode.exe程序并单击“Button1”按钮,看,静态文本框出现了乱码。

第三步:

改为Unicode编码环境编译该工程,生成Unicode.exe。再次运行Unicode.exe程序并单击“Unicode”按钮。看到Unicode编码的优势了吧。

*** 作:

到底什么是ANSI,什么是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit。8bit的ANSI编码只能表示256种字符,表示26个英文字母是绰绰有余的,但是表示汉字,韩国语,日语等有着成千上万个字符的非西方字符肯定就不够了,正是如此才引入了UNICODE标准。

在软件开发中,特别是使用C语言的一些有关字符串处理的函数,ANSI和UNICODE是区分是用的,那么ANSI类型的字符和UNICODE类型的字符如何定义,如何使用呢?ANSI和UNICODE又如何转换呢?

一.定义部分:

ANSI: char str[1024] 可用字符串处理函数:strcpy( ), strcat( ), strlen( )等等。UNICODE:wchar_t str[1024];可用字符串处理函数

二.可用函数:

ANSI:即 char, 可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。

UNICODE:即wchar_t 可用字符串处理函数:wcscat(),wcscpy(),wcslen()等以wcs打头的函数。

三.系统支持

Windows 98 :只支持ANSI。

Windows 2k :既支持ANSI又支持UNICODE。

Windows CE :只支持UNICODE。

说明

1. 在COM里面只支持UNICODE。

2. Windows 2000整个OS系统都是基于UNICODE的,为此在windows 2000下使用ANSI是需要付出代价的,虽然在编码上不用任何的转换,但是这种转化是隐藏的,是占用系统资源的(CPU,内存)。

3. 在Windows 98下必须使用UNICODE,则需要自己手动的编码切换。

三.如何区分:

在我们软件开发中往往需要即支持ANSI又支持UNICODE,不可能在要求类型转换的时候,重新改变字符串的类型,和使用于字符串上的 *** 作函数。为此, 标准的C 运行期库和Windows 提供了宏定义的方式。

在C语言里面提供了 _UNICODE宏(有下划线),在Windows里面提供了UNICODE宏(无下划线),只要定了_UNICODE宏和UNICODE宏,系统就会自动切换到UNICODE版本,否则,系统按照ANSI的方式进行编译和运行。

只定义了宏并不能实现自动的转换,他还需要一系列的字符定义支持。

1. TCHAR

如果定义了UNICODE宏则TCHAR被定义为wchar_t。

typedef wchar_t TCHAR

否则TCHAR被定义为char

typedef charTCHAR

2. LPTSTR

如果定义了UNICODE宏则LPTSTR被定义为LPWSTR。

typedef LPTSTR LPWSTR

否则TCHAR被定义为char

typedef LPTSTR LPSTR

说明: 在使用字符串常量的时候需要使用_TEXT(“MyStr”)来支持系统的自动转换。

Build菜单,有个Set Active Configuration,选择UNICODE配置,然后save all,rebuild all即可。这样就修改了默认编译模式。

如果修改不掉,应该是VC6安装或者工程有问题,某些配置写入失败。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/7987823.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存