【问题标题】:What is Microsoft using as the data type for Unicode Strings?Microsoft 使用什么作为 Unicode 字符串的数据类型?
【发布时间】:2010-11-23 08:09:35
【问题描述】:

我正在学习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 库中的示例,你们中是否有人对此有偏好或有一些建议?

干杯,

安德鲁

【问题讨论】:

  • 感谢大家的反馈!欣赏它! :-)

标签: c++ unicode atl wtl


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不同意。 wchar_t 应该是固定宽度的,并且在 Microsoft 世界中。有固定宽度的旧 UCS-2。两者都支持最多 65536 个字符。 UTF-16 是可变宽度字符集,其中字符的每个部分为 2 个字节。字符是 2 字节或 4 字节。这确保了 UTF-16 可以支持 1,114,112 个字符。据我所知,微软将 UCS-2 用于 wchar_t。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      简短的回答:具有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 位字编码)。还有其他广泛使用的表示形式不一定正确。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多