认识字符集(ANSI、Unicode)
来源:互联网 发布:淘宝全屏大图代码 编辑:程序博客网 时间:2024/05/16 07:14
ANSI:单字节字符
Unicode:双字节字符
WINDOWS系统对字符集的支持:
• Windows 2000 既支持U n i c o d e ,也支持A N S I ,因此可以为任意一种开发应用程序。
• Windows 98 只支持A N S I ,只能为A N S I 开发应用程序。
• Windows CE 只支持U n i c o d e ,只能为U n i c o d e 开发应用程序。
操作系统在使用不同的字符集时要进行字符转换,如win2000系统,如果程序函数中使用了ANSI字符集,系统需要将其转换成Unicode再执行,如果函数返回也是ANSI字符,则返回结果再从Unicode转换为ANSI。因此如果你开发的程序运行在WIN2000下,请用Unicode字符集,这将获得更快执行速度、更节省资源。
定义不同的字符集:
• wchar_t:标准的C 头文件S t r i n g . h 定义了Unicode字符定义typedef unsigned short wchar_t
处理不同字符集的函数:
t r c p y 、s t r c h r 和s t r c a t 等,只能对A N S I 字符串进行操作,不能正确地处理U n i c o d e 字符串。因此,ANSI C 也拥有一组补充函数,如上面函数对应的是wcschr、wcs c h r 和wcsc a t 。
所有的U n i c o d e 函数均以w c s 开头,w c s 是宽字符串的英文缩写。若要调用U n i c o d e函数,只需用前缀w c s 来取代A N S I 字符串函数的前缀s t r 即可。
通用的程序开发:
如果你不能确定你的程序运行环境,虽然提倡使用Unicode字符集,但如果有时要运行在win98下呢?因此你可能需要开发一种可在两种环境都可运行的程序。
认识两个宏(U N I C O D E 和_ U N I C O D E):
_U N I C O D E 宏用于C 运行期头文件,而U N I C O D E 宏则用于Wi n d o w s 头文件。有些函数的运行过程视乎这个宏的定义,如果定义了(_UNICODE或UNICODE,不同环境下使用,不要混了),这些函数处理Unicode字符集,否则处理ANSI字符集。
认识TCHAR:
如果定义了_ U N I C O D E ,T C H A R 将声明为下面的形式:
typedef wchar_t TCHAR;
如果没有定义_ U N I C O D E ,则T C H A R 将声明为下面的形式:
typedef char TCHAR;
认识L、_T:
我们经常看到程序里面有如L"this is a wchar"、_T("this is a TCHAR")的字符定义,需要注意的是L表明这些字符是Unicode的,而_T则表明这些字符是Unicode还是ANSI要看是否定义了_UNICODE宏。
通用字符集处理函数:
如_ t c s c p y函数,如果定义了_UNICODE宏,他就是strcpy,如果没有定义它就是wcscpy。
WINDOWS中定义字符:
尽管WINDOWS中定义了很多字符串类型,但有规律的,注意观察体会下就可以了。举几个例子:
LPSTR : char*
LPCSTR : const char*
LPWSTR : wchar_t*
LPCWSTR : const wchar_t*
LPTSTR : TCHAR*
LPCTSTR : const TCHAR*
注意其中的C、W、T,看出规律了吧
有时你会看到前面不是LP,而是P,如PSTR。在WIN16时代有长指针(LP)与短指针(P)之别,现在两者是一样的了。
认识一些函数名的后缀:
举例子说明:
CreateWindowExW:处理Unicode字符集的
CreateWindowExA:处理ANSI字符集的
通常我们只用CreateWindowEx,它会根据是否定义宏UNICODE来决定使用哪个函数
Windows字符串函数:
Wi n d o w s 还提供了一组范围很广的字符串操作函数。这些函数与C 运行期字符串函数(如s t r c p y 和w c s c p y )很相似。但是该操作系统函数是操作系统的一个组成部分,操作系统的许多组件都使用这些函数,而不使用C 运行期库。建议最好使用操作系统函数,而不要使用C 运行期字符串函数。这将有助于稍稍提高你的应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程E x p l o r e r. e x e 所使用。由于这些函数使用得很多,因此,在你的应用程序运行时,它们可能已经被装入R A M 。
在经典的操作系统函数样式中,操作系统字符串函数名既包含大写字母,也包含小写字母,它的形式类似这个样子:S t r C a t 、S t r C h r 、S t r C m p 和S t r C p y 等。若要使用这些函数,必须加上S h l WA p i . h 头文件。
l s t r c a t 将一个字符串置于另一个字符串的结尾处
l s t r c m p 对两个字符串进行区分大小写的比较
l s t r c m p i 对两个字符串进行不区分大小写的比较
l s t r c p y 将一个字符串拷贝到内存中的另一个位置
l s t r l e n 返回字符串的长度(按字符数来计量)
大小写转换:
t o l o w e r 和t o u p p e r :可能对某些Unicode字符支持不好,请用另外的两个windows函数代替:
PTSTR CharLower(PTSTR pszString);
PTSTR CharUpper(PTSTR pszString);
成为符合ANSI和Unicode的应用程序建议:
即使你不打算立即使用U n i c o d e ,最好也应该着手将你的应用程序转换成符合U n i c o d e 的应用程序。下面是应该遵循的一些基本原则:
• 将文本串视为字符数组,而不是c h a r s 数组或字节数组。
• 将通用数据类型(如T C H A R 和P T S T R )用于文本字符和字符串。
• 将显式数据类型(如B Y T E 和P B Y T E )用于字节、字节指针和数据缓存。
• 将T E X T 宏用于原义字符和字符串。
• 执行全局性替换(例如用P T S T R 替换P S T R )。
• 修改字符串运算问题。例如函数通常希望你在字符中传递一个缓存的大小,而不是字节。
这意味着你不应该传递s i z e o f ( s z B u ff e r ) ,而应该传递(s i z e o f ( s z B u ff e r ) / s i z e o f ( T C H A R )。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来分配内存。这就是说,应该调用malloc(nCharacters *sizeof(TCHAR)),而不是调用m a l l o c( n C h a r a c t e r s )。在上面所说的所有原则中,这是最难记住的一条原则,如果操作错误,编译器将不发出任何警告。
- 认识字符集(ANSI、Unicode)
- 认识字符集(ANSI、Unicode)
- ANSI、MBCS、UNICODE字符集
- ANSI、MBCS、UNICODE字符集
- ANSI和Unicode字符集
- Unicode与ANSI字符集
- ANSI/Unicode 字符集分析
- ANSI字符集和Unicode字符集
- ANSI字符集和Unicode字符集
- ANSI字符集和Unicode字符集
- 字符集编码ANSI和UNICODE
- 字符集编码ANSI和UNICODE
- ASCII、ANSI、MBCS、UNICODE字符集
- 初识ANSI字符集和UNICODE字符集
- ANSI(ASCII字符集)和UNICODE(UTF8,UTF16 )
- _T(windows使用两种字符集ANSI和Unicode)
- UNICODE、ANSI字符集和字符串操作
- UNICODE、ANSI字符集和字符串操作
- [转载]GCC的__attribute__扩展功能
- linux下启动模式
- 第一次写的VC服务进程
- GetLastError返回代码的定义
- JS动态生成树(JS+JSP)
- 认识字符集(ANSI、Unicode)
- DATAROW 交换
- Linux的五个查找命令:find,locate,whereis,which,type
- Java 取整
- 用DELPHI编写一个服务进程
- C# ddraw实现视频流的显示
- 文章发布系统中遇到的问题,求救
- 短信群发接口测试(C#+webservice)
- MFC的字符串CString处理