Chinaunix首页 | 论坛 | 博客
  • 博客访问: 85059
  • 博文数量: 34
  • 博客积分: 1640
  • 博客等级: 上尉
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-17 14:37
文章分类
文章存档

2008年(34)

我的朋友
最近访客

分类:

2008-04-20 22:08:42

为了同时处理中文字符和英文字符,我们常常需要使用Unicode编码。通过利用#define技术,it is possible to write a single source code so that it can be compiled with or without using Unicode -- you need only define two macros (UNICODE and _UNICODE) to make the change and then recompile. 通过研究Windows是如何完成这个任务的,我们也可以在今后利用同样的技术。
 
下面是对Unicode和ANSI字符串处理相关的总结:
类型: char wchar_t
部分处理函数: 
 char * strcat(char *, const char *);
 wchar_t * wcscat(wchar_t *, const wchar_t *);
 char * strchr(const char *, int);
 wchar_t * wcschr(const wchar_t *, wchar_t);
 int strcmp(const char *, const char *);
 int wcscmp(const wchar_t *, const wchar_t *);
 char * strcpy(char *, const char *);
 wchar_t * wcscpy(wchar_t *, const wchar_t *);
 size_t strlen(const char *);
 size_t wcslen(const wchar_t *);
 
无论是类型还是函数,我们需要这样一种符号:当我们定义了_UNICODE时,这个符号就转换为Unicode版本的类型或是函数;但当我们没有定义_UNICODE是,该符号就对应于single-bytes版本。利用define和typedef我们可以完成这样的任务。
 
对于类型来说,我们可以这样定义:
#ifdef _UNICODE
 typedef wchar_t TCHAR
#else
 typedef char TCHAR
当我们定义一个字符串变量的时候,我们需要用TCHAR来定义该变量,而不能用具体的类型。例如:
TCHAR* str;
如果我们定义了_UNICODE,也就是有这样的语句#define _UNICODE,上面的代码将会被转换为:
wchar_t* str;
否则,为:
char* str;
这也就是我们所需要的。
 
对于函数来说,我们也可以使用同样的机制:
#ifdef _UINCODE
 #define wcslen _tcslen
#else 
 #define strlen _tcslen
#endif
当我们调用这些函数的时候,我们也应该使用_tcs版本,而不是wcs或str版本。
 
所有这些都在文件tchar.h中定义的,所以要使用这些更通用的函数,我们需要包含这个文件。
 
另外,我们常常会使用字符串常量,例如
char* str = "Error";
但是如果我们这样来定义str的话,
TCHAR* str = "Error";
当定义了_UNICODE时,上述定义将会出错。因为对于“Error”,编译器将其作为char*类型的常量,而不是wchar_t类型的常量。对于wchar_t类型的常量,我们需要在前面加个L,及L"Error"。也就是说,我们有:
char* str = "Error";
wchar_t* str = L"Error";
为了能够统一这两个语句,我们就需要定义一个define变量。当我们define了_UNICODE时,其转换为L,而当我们没有定义_UNICODE时,其不进行转换。下面代码可以实现这个功能:
#ifdef _UNICODE
 #define _TEXT(x) L ## x
#else
 #define _TEXT(x) x
#endif
这样上面的两个定义就可以统一为:
TCHAR* str = _TEXT("Error");
 
在Windows,定义了很多这样的替换方式,比如PTSTR用来表示PWSTR和PSTR,PCTSTR用来替换PCWSTR和PCSTR。但是需要注意的是,为了使用Windows定义的这些替换方式,我们需要定义UNICODE,而不是_UNICODE._UNICODE是针对C run-time header file而言的。但是,常常我们需要同时定义他们两个。但我们可以使用下面的代码来简化:
#ifdef _UNICODE
#define UNICODE
#endif
这样我们就只需要决定定不定义_UNICODE就可以了。
 
对于这种技术的总结。
任务:当前我们有两种不同的类型或函数a, b。不同之处在于他们所处理的对象。我们需要只通过define一个变量,比如t, 就可以决定最终的代码使用的是哪种类型或函数。
实现:
1. 选择一种符号c来表示a和b
2. 利用define和typedef将c和a,b联系起来.如果a,b是类型的话,使用typedef,否则使用#define.
如果a,b为类型:
#ifdef t
 typedef c a
#else
 typedef c b
#endif
如果a, b为函数或其它
#ifdef t
 #define c a
#else
 #define c b
#endif
3.利用c来定义变量或表示函数。
4.根据需要使用#define t。

 
阅读(731) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~