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

时间:2009-08-27 10:45:52

标签: c++ unicode atl wtl

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

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

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

VERIFY(SetWindowText(L"Direct2D Sample"));

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

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

#define UNICODE 

OR

#define _UNICODE

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

wchar_t

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

_TEXT(t)

简单地将字符串作为前缀,并将混合数据类型作为

TCHAR 

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

另外,当我说微软使用这个,更具体地说是ATL和WTL库中的exmaple时,你们中的任何人都有偏好或对此有一些建议吗?

干杯,

安德鲁

4 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:5)

简短回答:具有TCHAR类型,_TEXT()宏和各种_t*函数(_tcscpy想到的)的混合基础架构是对时代的回归当微软有两个平台共存时:

  1. Windows NT行基于Unicode字符串表示
  2. Windows 95/98 / ME系列基于ANSI字符串表示。
  3. 此处的字符串表示表示期望或返回到应用程序的字符串的所有Windows API都使用这些字符串的一个或另一个表示形式。 COM在两个平台上都提供了更多的混淆 - 并且两者都有预期的Unicode字符串!

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

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

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

答案 2 :(得分:2)

在Windows上,它的wchar_t采用UTF-16(2字节)编码。

来源:http://www.firstobject.com/wchar_t-string-on-linux-osx-windows.htm

答案 3 :(得分:1)

TCHAR根据是否定义了UNICODE来更改其类型,并且当您需要可以为UNICODE和非UNICODE编译的代码时,应该使用它。

如果您只想显式处理UNICODE数据,请随意使用wchar_t。