几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » 程序设计 » vc编程
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2007-05-10, 03:24 PM   #1
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 【转帖】vc6中的mbcs和unicode编码

今天写的一段代码涉及到MBCS编码和UNICODE编码的相互转换,查了一下MSDN的相关资料,整理如下:

在VC6中,默认使用MBCS编码,即多字节字符,实际就是支持大于0x80的ASCII码。这样,一个中文字可以表示为2个字节,GB2312就是这样表示的。

VC6的默认安装是不带UNICODE库的,要在VC6中写UNICODE程序,必须安装CRT和MFC的Unicode库。

要使你的程序支持Unicode,要在你的项目属性中去掉"_MBCS"宏定义,增加"UNICODE"和"_UNICODE"两个宏定义。(注意,这两个都应该加上,因为CRT和MFC使用UNICODE定义,而STL则使用_UNICODE)

如果你的程序是MFC的,则Unicode版MFC库的入口点是wWinMainCRTStartup。

为了方便开发者,VC6中提供了Tchar.h,里面定义了一些宏用来帮助写两种编码都兼容的代码。

类型

一般文本 数据类型名称 _UNICODE 和 _MBCS 未定义 _MBCS 已定义 _UNICODE 已定义 _TCHAR

char

char

wchar_t

_TINT

int

int

wint_t

_TSCHAR

signed char

signed char

wchar_t

_TUCHAR

unsigned char

unsigned char

wchar_t

_TXCHAR

char

unsigned char

wchar_t

_T 或 _TEXT

无效(由预处理器移除)

无效(由预处理器移除)

L(将后面的字符或字符串转换成相应的 Unicode 形式)



CRT中的相关函数在Tchar.h中都定义了相应的替代,基本是将str换成了_tcs,比如:CRT中的unsigned int strlen(const char *)现在是unsigned int _tcslen(const TCHAR*),在Uniocde时,将被替换为unsigned int _wcslen(const wchar_t)*,而在MBCS时,会被替换为unsigned int _mcslen(const char*)。

看,写Unicode和MBCS兼容的代码挺容易的吧,我总结了一些替换规则

1 将char换成TCHAR (unsigned char必须去掉unsigned)

2 将str函数换成_tcs函数

3 将字符串常量定义加要_T("")宏

4 printf函数族必须修改为wprintf,不过要注意千万不要使用wprintf函数来解析char型

很多时候程序中既需要Unicode,又需要使用ASCII,这时需要用到操作系统的2个API

WideCharToMultiByte用来将Unicode字符串转化为MBCS的

MultiByteToWideChar用来将MBCS字符串转化为Unicode的

一些注意事项:

在Unicode编码下,sizeof没那么可靠了,memset( ,0, sizeof())的习惯用法可能会出大错,改成memset(,0,sizeof()/szieof(TCHAR))就没事了,呵呵

在Unicode下,一个中文字符就是一个字符,len = strlen() / 2;这样可不行了
yogy离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
旧 2007-05-10, 03:24 PM   #2
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: 【转帖】vc6中的mbcs和unicode编码

Visual C++
Unicode 和 MBCS


为支持国际编程,启用了 Microsoft 基础类库 (MFC)、Visual C++ 的 C 运行时库和 Visual C++ 开发环境。它们:
  • 在 Windows 2000(以前为 Windows NT)上提供对 Unicode 标准的支持。

    Unicode 是为所有语言提供足够编码的 16 位字符编码。所有 ASCII 字符都作为“加宽”字符包含在 Unicode 中。

    注意Windows 95、Windows 98 或 Windows Millennium Edition 上不支持 Unicode 标准。

  • 在所有平台上,支持称为双字节字符集 (DBCS) 的多字节字符集 (MBCS) 形式。

    DBCS 字符由一个或两个字节构成。某些范围的字节留出用作“前导字节”。前导字节指定由它和后面的“尾字节”构成单个双字节宽字符。必须清楚哪些字节是前导字节。在某个多字节字符集内,前导字节位于某个特定范围内,尾字节也一样。当这两种范围重叠时,可能需要计算上下文以确定某个给定的字节是用作前导字节还是尾字节。
  • 对简化 MBCS 编程的工具提供支持(MBCS 编程用于为国际市场编写的应用程序)。

    当在支持 MBCS 的 Windows 操作系统版本上运行时,Visual C++ 开发系统(包括集成的源代码编辑器、调试器和命令行工具)完全支持 MBCS。有关更多信息,请参见 Visual C++ 中的 MBCS 支持
注意在本文档中,MBCS 用于描述所有对多字节字符的非 Unicode 支持。在 Visual C++ 中,MBCS 始终是指 DBCS。不支持比两个字节宽的字符集。


按照定义,ASCII 字符集是所有多字节字符集的子集。在许多多字节字符集中,0x00 到 0x7F 范围内的每个字符都与 ASCII 字符集中具有相同值的字符相同。例如,在 ASCII 和 MBCS 字符串中,单字节 NULL 字符(“\0”)的值都是 0x00 并且指示终止空字符。
yogy离线中   回复时引用此帖
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 03:20 PM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多