_MBS _unicode

 转载自:

http://www.cnitblog.com/vcleaner/archive/2005/06/20/456.html

 

Unicode的出现是为了适应软件国际化的需要。Unicode不同于双字节字符集(DBCS)。
一、相关操作函数
1、DBCS使用下面的函数操作字符串:
CharNext——获得后一个字符
CharPrev——获得前一个字符
IsDBCSLeadByte——判断是否为两个字节字符的第一个字节
C++运行期库提供了以"_mbs"开头的一系列的函数操作DBCS。类似的函数有_mbscat等。

2、ANSI字符集是一个美国标准。C++运行期库提供了以"str"开头的一些列的函数操作此字符集。

3、C++运行期库为Unicode字符集提供了一系列以"wcs"开头的函数。

二、对应的数据类型
1、对于ANSI字符定义为char。
2、对于Unicode的字符定义为wchar_t。

三、使用环境
1、首先要说明的是Win98对于Unicode的支持是很微弱的,所以如果要在Win98上运行Unicode编译的程序,可能造成运行错误或者失败。

2、由于Win2000及以后的OS的内核都是使用Unicode编写的,所以虽然可以在其上运行ANSI编码的程序,但是其运行过程中很多地方都需要将ANSI转换为Unicode以后,调用Unicode版本的函数,因为这个转换的过程存在所以ANSI的程序运行效率不高。在Win2000上最好使用Unicode编写程序。

四、编写通用的程序
1、在编程的时候使用TCHAR数据类型,此类型能够根据预编译宏的定义,将其转换为ANSI或者是Unicode。

2、预编译宏_MBCS、_UNICODE和UNICODE。_MBCS是多字节和ANSI字符串的编译宏。此时TCHAR将转换为char。_UNICODE和UNICODE是Unicode编码的预编译宏,TCHAR将转换为wchar_t。

3、_UNICODE和UNICODE与_MBCS不能在编译的时候同时被定义。

4、_UNICODE宏用于C运行期库的头文件,UNICODE宏用于Windows头文件。一般同时定义这两个宏。

 

 转载自:

 http://www.xland.com.cn/article/7/133/0704/17978.htm

 

今天写的一段代码涉及到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;这样可不行了

 

 

// 本人补充

字符串指针 (LPTSTR  or PTCHAR)

指向常字符串的指针 LPCTSTR

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值