zoukankan      html  css  js  c++  java
  • Windows桌面应用开发字符串的使用

    MSDN上英语原文 

    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 和 ANSI 函数

    当微软推出支持UnicodeWindows,为了过渡提供了两套并行的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

    当应用程序需要支持WindowsNTWindows95/WIndows98/WindowsME时,根据目标平台,为相同的代码编译成ANSIUnicode字符串它是相当有用的。为此,Windows SDK提供了字符串映射到UnicodeANSI的宏。这取决于目标平台

    Unicode

    ANSI

    TCHAR

    wchar_t

    char

    TEXT(“x”)

    L”x”

    “x”

    示例代码:

    SetWindowText(TEXT(“My Application”));


    解析为以下操作之一:

    SetWindowTextW(L”My Application”)); //宽字符字符串的Unicode函数
    
    SetWindowTextA(“My Application”); //ANSI函数
    

    TCHARTEXT宏如今的用处并不大,因为所有的应用程序应该使用Unicode,然而,你可能会在较旧的代码或MSDN示例代码上看到。

    微软的C运行时库的头文件定义了一组相似的宏,例如,如果为定义_UNICODE_tcslen解析为strlen,否则它解析为wcslen,这是strlen的宽字符版本。

    #ifdef _NUICODE
    
    #define _tcslen wcslen
    
    #else
    
    #define _tcslen strlen
    
    #endif
    

    注意: 有些头是使用预处理器符号UNICODE,另外一些使用下划线前缀_UNICODE。当你创建一个新项目时,默认情况下始终都定义两个符号。

  • 相关阅读:
    每天学习一个设计模式(十二):创建型之单例模式
    每天学习一个设计模式(十一):创建型之原型模式
    每天学习一个设计模式(十):创建型之工厂方法模式
    每天学习一个设计模式(九):创建型之建造者模式
    数据库
    操作系统
    计算机网络
    Java 基础知识
    Linux基本操作
    git 基本操作
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3030506.html
Copyright © 2011-2022 走看看