5

我正在学习 C++,在 MSDN 上看到了一篇文章:

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

在第一个代码示例中,与我的问题相关的一行代码如下:

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

更具体地说,是 L 前缀。我读了一点,如果我错了,请纠正我:-),但这是为了允许使用 unicode 字符串,即为长字符集做准备。现在,在我阅读这篇文章的过程中,我在这里遇到了另一篇关于 C 语言中的高级字符串技术的文章http://www.flipcode.com/archives/Advanced_String_Techniques_in_C-Part_I_Unicode.shtml

它说有几个选项,包括包含标题:

#define UNICODE 

或者

#define _UNICODE

在 C 中,再次指出我是否错了,感谢您的反馈。此外,它显示了适用于这些 un​​icode 字符串的数据类型:

wchar_t

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

_TEXT(t)

它只是在字符串前面加上 L 和混合数据类型作为

TCHAR 

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

另外,当我说 Microsoft 是否使用此功能时,更具体地说是 ATL 和 WTL 库中的示例,你们中是否有人对此有偏好或有一些建议?

干杯,

安德鲁

4

4 回答 4

12

对于所有新软件,您应该定义 UNICODE 并直接使用 wchar_t。使用 ANSI 搅拌器会再次困扰您。

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

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

于 2009-08-27T10:51:56.983 回答
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 位字编码)。还有其他广泛使用的表示,这不一定是正确的。

于 2009-08-27T11:00:46.187 回答
2

在 Windows 上,它是带有 UTF-16(2 字节)编码的 wchar_t。

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

于 2009-08-27T10:52:26.903 回答
1

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

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

于 2009-08-27T10:52:57.560 回答