Microsoft使用什么作为Unicode字符串的数据类型?

REA*_*REW 5 c++ unicode wtl atl

我正在学习C++,在这里遇到了一篇关于MSDN的文章:

http://msdn.microsoft.com/en-us/magazine/dd861344.aspx

在第一个代码示例中,我的问题涉及的一行代码如下:

VERIFY(SetWindowText(L"Direct2D Sample"));
Run Code Online (Sandbox Code Playgroud)

更具体地说,L前缀.我有一点阅读,并纠正我,如果我错了:-),但这是为了允许unicode字符串,即准备一个长字符集.现在,在我阅读这篇文章的过程中,我在另一篇关于C中的Adavnced String Techniques的文章中发表了这篇文章http://www.flipcode.com/archives/Advanced_String_Techniques_in_C-Part_I_Unicode.shtml

它说有一些选项,包括标题:

#define UNICODE 
Run Code Online (Sandbox Code Playgroud)

要么

#define _UNICODE
Run Code Online (Sandbox Code Playgroud)

在C中,再次指出我是错的,感谢您的反馈.此外,它显示适合这些unicode字符串的数据类型:

wchar_t
Run Code Online (Sandbox Code Playgroud)

它混合了一个宏和一种混合数据类型,宏是:

_TEXT(t)
Run Code Online (Sandbox Code Playgroud)

它只是将字符串前缀为L,混合数据类型为

TCHAR 
Run Code Online (Sandbox Code Playgroud)

如果标题存在则指出它将允许unicode,否则允许ASCII.现在我的问题是,或者更多的是我想要确认的假设,微软会使用这种更灵活的TCHAR数据类型,或者承诺使用wchar_t有什么好处.

另外,当我说微软使用它时,更具体地说是ATL和WTL库中的exmaple,你们自己是否有偏好或对此有一些建议?

干杯,

安德鲁

obe*_*lix 12

对于所有新软件,您应该定义UNICODE并直接使用wchar_t.使用ANSI stirngs会回来困扰你.

您应该只使用wchar_t和所有CRT函数的宽版本(例如:wcscmp而不是strcmp).如果您的代码需要在ANSI和UNICODE环境中工作,那么TEXT宏和TCHAR等就存在了,我觉得代码很少需要这样做.

使用Visual Studio创建新的Windows应用程序时,会自动定义UNICODE,并且wchar_t将像内置一样工作.


Las*_*loG 5

简短回答:具有TCHAR类型,_TEXT()宏和各种_t*功能的混合基础设施(_tcscpy想到)是微软有两个平台共存时的回归:

  1. Windows NT行基于Unicode字符串表示
  2. Windows 95/98/ME系列基于ANSI字符串表示.

此处的字符串表示意味着期望或返回应用程序字符串的所有Windows API都使用这些字符串的一个或另一个表示形式.COM增加了更多的混乱,因为它可以在两个平台上使用 - 并且两者都有预期的Unicode字符串!

在那些旧时代,鼓励您编写"可移植"代码:您被指示为字符串使用混合基础结构,以便您可以通过为应用程序定义/取消定义UNICODE和/或_UNICODE来为两个模型进行编译.

由于Windows9x系列不再相关(无论如何绝大多数应用程序),您可以安全地忽略ANSI世界并直接使用Unicode字符串.

请注意,虽然Unicode今天有多种表示形式:正如上面指出的那样,wchar_t暗示的Unicode约定是UCS-2表示(所有字符都以16位字编码).还有其他广泛使用的表示,这不一定是真的.