我正在学习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时,你们中的任何人都有偏好或对此有一些建议吗?
干杯,
安德鲁
答案 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
想到的)的混合基础架构是对时代的回归当微软有两个平台共存时:
此处的字符串表示表示期望或返回到应用程序的字符串的所有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。