你不能 - 没有 c++0x 支持。c++0x 定义了以下声明字符串文字的方式:
- “某些实现定义的编码中的 char 字符串” - char
- u8"utf8 字符串" - char
- 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' };
这太可怕了。