MSDN文档翻译 Learn to Program for Windows in C++ 005 序章第三节
2015-01-21 23:03
681 查看
序章/第三节:字符串处理
Windows在UI元素、文件名、等等上,原生的支持Unicode字符串。Unicode是目前首选的字符编码方案,因为它支持目前所有的字符形式与语言。Windows所采用的Unicode编码方案是UTF-16编码方案,在这种方案里,每一个字符被编码成一个16位宽的整数值。UTF-16字符被称为“宽字符”,以区别8位的ANSI字符。Visual C++编译器用内置数据类型wchar_t来支持宽字符。在头文件<WinNT.h>中也定义了宽字符类型的别名,如下所示:
typedef wchar_t WCHAR;
你会在MSDN的代码样例中看到以下两种代码:第一种声明一个宽字符变量,另一种声明一个宽字符串。具体做法就是在字面值常量之前加上一个【L】前缀,将其转换为宽字符编码方式的字符/字符串。
wchar_t a = L'a';
wchar_t *str = L"hello";
这是一些其它的字符串相关的类型别名,在后续部分你将逐渐接触:
类型别名 定义
CHAR char
PSTR / LPSTR char ×
PCSTR / LPCSTR const char *
PWSTR / LPWSTR wchar_t *
PCWSTR / LPCWSTR const wchar_t *
1: Unicode与ANSI函数
当微软宣布Windows操作系统支持Unicode编码方式时,为了减轻过渡时期的阵痛,微软提供了两套平等的API,一套用以处理ANSI字符串,一套用以处理Unicode字符串。例如,下面是两个用以设置窗口标题栏文本的函数:
SetWindowTextA // 接收一个ANSI字符串
SetWindowTextW // 接收一个Unicode字符串
在内部,ANSI版本将字符串转换成了Unicode形式(因为Windows操作系统支持的是Unicode编码,而不是ANSI编码)。Windows头文件中也定义了一个宏,当预处理宏【UNICODE】被定义时,字符串将会以Unicode编码形式被处理,否则,字符串将被ANSI形式处理,宏定义如下:
#ifndef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
在MSDN文档中,这个函数被描述成了【SetWindowText】函数,尽管这并不是真正的函数名,而是一个宏的名称。
现在新的应用程序应该始终调用Unicode版本的函数。世界上很多语言都需要用Unicode编码来表示,如果你用ANSI字符串,想要将你的应用程序在非英语地区本地化则无疑是天方夜谭。同时,ANSI版本的函数相较而言效率也比较低下,因为要运行ANSI版本的函数,程序运行时,操作系统需要将ANSI编码方式的字符串先翻译成Unicode编码形式的字符串。根据你个人的偏好,你可以直接调用Unicode版本的函数,例如直接使用【SetWindowTextW】,也可以调用宏【SetWindowText】。MSDN上的代码样例经常使用宏,但实际上这两种形式是完全等价的。并且很多新的Windows
API接口只有Unicode版本,没有相应的ANSI版本。
2: TCHARs
让我们回到那个需要同时支持NT平台的时代吧,你需要支持Windows 95/98/Me,在这个过渡的时代,有一种非常有用的策略,可以实现用相同的代码来编译包含Unicode字符串的程序与包含ANSI字符串的程序,具体编译哪种编码,取决于具体的平台。为了实现这个策略,Windows SDK提供了将字符串映射为Unicode编码或ANSI编码的宏,而具体映射为什么编码,取决于具体一平台。
宏 对应的Unicode类型 对应的ANSI类型
TCHAR wchar_t char
TEXT("x") L"x" "x"
例如,下面这句代码:
SetWindowText(TEXT("My Application"));
将被解析为下列代码语句中的某一句:
SetWindowTextW(L"My Application"); // Unicode函数与宽字符串
SetWindowTextA("My Application"); // ANSI函数与8位字符串
而在如今,宏【TEXT】与【TCHAR】就很少见了,因为现在所有的应用程序都应该使用Unicode编码,你可能会在一些有历史的代码或MSDN的代码样例中见到它们
Microsoft的C语言运行时库中的头文件也定义了一些类似的宏,例如:在宏【_UNICODE】未被定义的情况下,【_tcslen】将被解析为【strlen】,否则将会被解析为【wcslen】,【wcslen】是宽字符版本的【strlen】。
#ifndef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
注意:有些头文件使用的预处理宏名为【UNICODE】,有些则用的是带一个短下划线的宏名【_UNICODE】。在实际应用时注意要将两个宏名都定义掉,当你新建一个项目时,Visual C++将这两个宏都按默认处理。
Windows在UI元素、文件名、等等上,原生的支持Unicode字符串。Unicode是目前首选的字符编码方案,因为它支持目前所有的字符形式与语言。Windows所采用的Unicode编码方案是UTF-16编码方案,在这种方案里,每一个字符被编码成一个16位宽的整数值。UTF-16字符被称为“宽字符”,以区别8位的ANSI字符。Visual C++编译器用内置数据类型wchar_t来支持宽字符。在头文件<WinNT.h>中也定义了宽字符类型的别名,如下所示:
typedef wchar_t WCHAR;
你会在MSDN的代码样例中看到以下两种代码:第一种声明一个宽字符变量,另一种声明一个宽字符串。具体做法就是在字面值常量之前加上一个【L】前缀,将其转换为宽字符编码方式的字符/字符串。
wchar_t a = L'a';
wchar_t *str = L"hello";
这是一些其它的字符串相关的类型别名,在后续部分你将逐渐接触:
类型别名 定义
CHAR char
PSTR / LPSTR char ×
PCSTR / LPCSTR const char *
PWSTR / LPWSTR wchar_t *
PCWSTR / LPCWSTR const wchar_t *
1: Unicode与ANSI函数
当微软宣布Windows操作系统支持Unicode编码方式时,为了减轻过渡时期的阵痛,微软提供了两套平等的API,一套用以处理ANSI字符串,一套用以处理Unicode字符串。例如,下面是两个用以设置窗口标题栏文本的函数:
SetWindowTextA // 接收一个ANSI字符串
SetWindowTextW // 接收一个Unicode字符串
在内部,ANSI版本将字符串转换成了Unicode形式(因为Windows操作系统支持的是Unicode编码,而不是ANSI编码)。Windows头文件中也定义了一个宏,当预处理宏【UNICODE】被定义时,字符串将会以Unicode编码形式被处理,否则,字符串将被ANSI形式处理,宏定义如下:
#ifndef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
在MSDN文档中,这个函数被描述成了【SetWindowText】函数,尽管这并不是真正的函数名,而是一个宏的名称。
现在新的应用程序应该始终调用Unicode版本的函数。世界上很多语言都需要用Unicode编码来表示,如果你用ANSI字符串,想要将你的应用程序在非英语地区本地化则无疑是天方夜谭。同时,ANSI版本的函数相较而言效率也比较低下,因为要运行ANSI版本的函数,程序运行时,操作系统需要将ANSI编码方式的字符串先翻译成Unicode编码形式的字符串。根据你个人的偏好,你可以直接调用Unicode版本的函数,例如直接使用【SetWindowTextW】,也可以调用宏【SetWindowText】。MSDN上的代码样例经常使用宏,但实际上这两种形式是完全等价的。并且很多新的Windows
API接口只有Unicode版本,没有相应的ANSI版本。
2: TCHARs
让我们回到那个需要同时支持NT平台的时代吧,你需要支持Windows 95/98/Me,在这个过渡的时代,有一种非常有用的策略,可以实现用相同的代码来编译包含Unicode字符串的程序与包含ANSI字符串的程序,具体编译哪种编码,取决于具体的平台。为了实现这个策略,Windows SDK提供了将字符串映射为Unicode编码或ANSI编码的宏,而具体映射为什么编码,取决于具体一平台。
宏 对应的Unicode类型 对应的ANSI类型
TCHAR wchar_t char
TEXT("x") L"x" "x"
例如,下面这句代码:
SetWindowText(TEXT("My Application"));
将被解析为下列代码语句中的某一句:
SetWindowTextW(L"My Application"); // Unicode函数与宽字符串
SetWindowTextA("My Application"); // ANSI函数与8位字符串
而在如今,宏【TEXT】与【TCHAR】就很少见了,因为现在所有的应用程序都应该使用Unicode编码,你可能会在一些有历史的代码或MSDN的代码样例中见到它们
Microsoft的C语言运行时库中的头文件也定义了一些类似的宏,例如:在宏【_UNICODE】未被定义的情况下,【_tcslen】将被解析为【strlen】,否则将会被解析为【wcslen】,【wcslen】是宽字符版本的【strlen】。
#ifndef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
注意:有些头文件使用的预处理宏名为【UNICODE】,有些则用的是带一个短下划线的宏名【_UNICODE】。在实际应用时注意要将两个宏名都定义掉,当你新建一个项目时,Visual C++将这两个宏都按默认处理。
相关文章推荐
- MSDN文档翻译 Learn to Program for Windows in C++ 003 序章第一节
- MSDN文档翻译 Learn to Program for Windows in C++ 004 序章第二节
- MSDN文档翻译 Learn to Program for Windows in C++ 002 序章前言
- MSDN文档翻译 Learn to Program for Windows in C++ 001 前言
- [RT]Learn to Program for Windows in C++
- Introduction to C++ Programming in UE4——UE4官方文档翻译与理解(一)
- 【UE4官方文档翻译】Introduction to C++ Programming in UE4 (介绍UE4中的C++编程)
- 【Kinect for Windows SDK MSDN文档翻译】之二
- Introduction to C++ Programming in UE4——UE4官方文档翻译与理解(二)
- C Program to sleep for millisecond in windows, linux
- 【Kinect for Windows SDK MSDN文档翻译】之一
- What is the best way to implement a heartbeat in C++ to check for socket connectivity?
- Programming Windows TCP Sockets in C++ for the Beginner
- How to disable the Media Sensing feature for TCP/IP in Windows
- how to write a DLL/SO in C/C++ for Python
- Sublime Text 2 for C/C++ and Python in Windows
- How to Run a Program as an Administrator in Windows 7
- Learn to narrow your search criteria for better searches in Outlook
- How to Run a Program as an Administrator in Windows 7
- Cross Platform library in C++ for Windows, WM, WinCE, MacOS, iPhone