Windows桌面应用开发-字符串的使用
2013-04-19 13:32
791 查看
MSDN上英语原文
Windows原生支持UI(用户界面)元素、文件名等等的Unicode字符串。Unicode是首选的字符编码,因为它支持所有的字符集和语言,Windows使用的是UTF-16编码的字符,其每一个字符都是一个16位值的编码,为了与8位的ANSI字符区分,UTF-16字符被称为宽字符。Visual C++编译器内置了数据类型wchart_t以对宽字符的支持,头文件WinNT.h中还定义了下列的类型定义:
在MSDN示例代码中会看到两个版本,要声明一个宽字符的字符或字符串,将’L’放在前面:
下列是一些其它字符串相关的类型定义
Unicode 和 ANSI 函数
当微软推出支持Unicode的Windows,为了过渡提供了两套并行的API,一套支持ANSI字符串,另一套支持Unicode字符串。例如:以下两个函数是设置窗体标题栏的文本:
SetWindowTextA 采用一个ANSI字符串
SetWindowTextW 采用一个Unicode字符串
在系统内,ANSI版本的字符串将转换成Unicode。在Windows的头文件里定义了一个宏来解析Unicode预处理符号来决定使用的是ANSI版本还是Unicode版本。
在MSDN,函数文档下的名称使用的是SetWindowsText,即使实际上这是宏名而不是真实的函数名。
新的应用程序应该总是调用Unicode版本。世界上许多语言需要Unicode。如果你使用ANSI字符串,它会无法本地化应用程序。ANSI版本效率比较低,因为在运行是系统必须将ANSI字符串转化为Unicode。根据你的喜好,你可以明确的调用Unicode版本,如SetWindowTextW,或是使用宏。MSDN的示例上使用的是调用宏,但是这两种形式是等价的。Windows大多数较新的API只有Unicode版本而没有ANSI版本。
TCHAR
当应用程序需要支持WindowsNT和Windows95/WIndows98/WindowsME时,根据目标平台,为相同的代码编译成ANSI或Unicode字符串它是相当有用的。为此,Windows SDK提供了字符串映射到Unicode或ANSI的宏。这取决于目标平台
示例代码:
解析为以下操作之一:
TCHAR和TEXT宏如今的用处并不大,因为所有的应用程序应该使用Unicode,然而,你可能会在较旧的代码或MSDN示例代码上看到。
微软的C运行时库的头文件定义了一组相似的宏,例如,如果为定义_UNICODE,_tcslen解析为strlen,否则它解析为wcslen,这是strlen的宽字符版本。
注意: 有些头是使用预处理器符号UNICODE,另外一些使用下划线前缀_UNICODE。当你创建一个新项目时,默认情况下始终都定义两个符号。
Windows原生支持UI(用户界面)元素、文件名等等的Unicode字符串。Unicode是首选的字符编码,因为它支持所有的字符集和语言,Windows使用的是UTF-16编码的字符,其每一个字符都是一个16位值的编码,为了与8位的ANSI字符区分,UTF-16字符被称为宽字符。Visual C++编译器内置了数据类型wchart_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 |
当微软推出支持Unicode的Windows,为了过渡提供了两套并行的API,一套支持ANSI字符串,另一套支持Unicode字符串。例如:以下两个函数是设置窗体标题栏的文本:
SetWindowTextA 采用一个ANSI字符串
SetWindowTextW 采用一个Unicode字符串
在系统内,ANSI版本的字符串将转换成Unicode。在Windows的头文件里定义了一个宏来解析Unicode预处理符号来决定使用的是ANSI版本还是Unicode版本。
#ifdef UNICODE #define SetWindowText setWindowTextW #else #define SetWindowText SetWindowTextA #endif
在MSDN,函数文档下的名称使用的是SetWindowsText,即使实际上这是宏名而不是真实的函数名。
新的应用程序应该总是调用Unicode版本。世界上许多语言需要Unicode。如果你使用ANSI字符串,它会无法本地化应用程序。ANSI版本效率比较低,因为在运行是系统必须将ANSI字符串转化为Unicode。根据你的喜好,你可以明确的调用Unicode版本,如SetWindowTextW,或是使用宏。MSDN的示例上使用的是调用宏,但是这两种形式是等价的。Windows大多数较新的API只有Unicode版本而没有ANSI版本。
TCHAR
当应用程序需要支持WindowsNT和Windows95/WIndows98/WindowsME时,根据目标平台,为相同的代码编译成ANSI或Unicode字符串它是相当有用的。为此,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函数
TCHAR和TEXT宏如今的用处并不大,因为所有的应用程序应该使用Unicode,然而,你可能会在较旧的代码或MSDN示例代码上看到。
微软的C运行时库的头文件定义了一组相似的宏,例如,如果为定义_UNICODE,_tcslen解析为strlen,否则它解析为wcslen,这是strlen的宽字符版本。
#ifdef _NUICODE #define _tcslen wcslen #else #define _tcslen strlen #endif
注意: 有些头是使用预处理器符号UNICODE,另外一些使用下划线前缀_UNICODE。当你创建一个新项目时,默认情况下始终都定义两个符号。
相关文章推荐
- Windows桌面应用开发-字符串的使用
- 使用NetBeans开发Java桌面应用程序时修改应用的UI样式为Windows
- 开发Windows商店应用时使用SmsDevice类API遇到的Access Denied问题解决方法
- ubuntu下使用golang、qml与ubuntu sdk开发桌面应用
- [Win10应用开发] 如何使用Windows通知
- 使用 javafx 开发windows应用
- 【hadoop之翊】——windows 7使用eclipse下hadoop应用开发环境搭建
- Win32++:可替代MFC的Windows桌面应用开发框架
- [高级]Android Launcher研究(一)-----------图文详解手把手教你在Windows环境下下载Android源码(Launcher为例)Android Launcher研究(四)-----------桌面应用快捷方式的开发!
- java桌面应用开发可视化工具windowbuilder详细使用方法
- 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
- 使用Eclipse RCP进行桌面程序开发(四):在Windows中使用Active X控件
- Windows桌面应用开发-MSDN教程-结构树
- Win32++:可替代MFC的Windows桌面应用开发框架
- 快速构建Windows 8风格应用1-开发工具安装及模拟器使用
- 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
- node-webkit 使用简介开发桌面应用
- Win32++:可替代MFC的Windows桌面应用开发框架
- 使用Python开发windows桌面程序
- Windows中使用Python和C/C++联合开发应用程序起步(Python/C API应用)