gpt4 book ai didi

c++ - _T( ) 宏更改为 UNICODE 字符数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:05 26 4
gpt4 key购买 nike

我有一个 UNICODE 应用程序,我们使用 _T(x) 定义如下。

#if defined(_UNICODE)
#define _T(x) L ##x
#else
#define _T(x) x
#endif

我知道 L 被定义为 wchar_t,它在任何平台上都是 4 个字节。如果我错了,请纠正我。我的要求是我需要L为2个字节。因此,作为编译器 hack,我开始使用 -fshort-wchar gcc 标志。但现在我需要将我的应用程序移动到 zSeries,在该平台上我看不到 -fshort-wchar 标志的效果。

为了能够在 zSeries 上移植我的应用程序,我需要修改 _T( ) 宏,即使在使用 L ##x 并且不使用 -fshort-wchar 标志之后,我也需要得到2 个字节宽的字符数据。有人能告诉我如何更改 L 的定义,以便我可以在我的应用程序中始终将 L 定义为 2 个字节。

最佳答案

如果没有 c++0x 支持,你不能。 c++0x 定义了以下声明字符串文字的方式:

  • “在某些实现定义的编码中的 char 字符串”- char
  • u8“utf8 字符的字符串”- 字符
  • u“utf16 字符字符串”- char16_t
  • U“utf32 字符字符串”- char32_t
  • L“wchar_t 的一些实现定义编码中的字符串”- wchar_t

在 c++0x 得到广泛支持之前,以跨平台方式对 utf-16 字符串进行编码的唯一方法是将其分解为位:

// make a char16_t type to stand in until msvc/gcc/etc supports
// c++0x utf string literals
#ifndef CHAR16_T_DEFINED
#define CHAR16_T_DEFINED
typedef unsigned short char16_t;
#endif

const char16_t strABC[] = { 'a', 'b', 'c', '\0' };
// the same declaration would work for a type that changes from 8 to 16 bits:

#ifdef _UNICODE
typedef char16_t TCHAR;
#else
typedef char TCHAR;
#endif
const TCHAR strABC2[] = { 'a', 'b', 'b', '\0' };

_T 宏只能在 wchar_t 为 16 位宽的平台上发货。而且,替代方案仍然不是真正的跨平台:char 和 wchar_t 的编码是实现定义的,因此 'a' 不一定对 'a' (0x61) 的 unicode 代码点进行编码。因此,为了严格准确,这是编写字符串的唯一方法:

const TCHAR strABC[] = { '\x61', '\x62', '\x63', '\0' };

这太可怕了。

关于c++ - _T( ) 宏更改为 UNICODE 字符数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4133144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com