MSVC2013 可以与两种原始字符串交互。生的char
字符串看起来像"Hello"
. wchar_t
字符串看起来像L"World"
.
此外,还有一个设置可以确定您的项目是否使用wchar_t
or char
字符串。宏观TCHAR
扩展到char
or wchar_t
,以及宏_T("some text")
将扩展到任一"some text"
or L"some text"
取决于您的项目是否编译使用char
or wchar_t
.
几乎每个采用字符串的 Windows API 都有一个宏将其包装起来,将其映射到char
版本或wchar_t
版本。
所有这一切的目标是使编写单个应用程序成为可能,并使其能够识别或不识别宽字符。
Windows 上的约定是窄字符char
接口使用基于代码页的系统和宽字符wchar_t
接口使用 UTF-16 字符(W2K 之前操作系统中 UCS-2 的子集,如果我正确阅读维基百科文章,XP 中没有系统字体支持 UCS-2 之外的字符)。
这一切的结束?您的项目已以某种方式设置为使用宽字符串。这是一件好事,因为窄字符构建的应用程序无法处理除一个字符代码页之外的任何内容。
因此,您的窄字符常量会产生错误,因为 API 现在需要宽字符常量。
简单的解决办法就是把你所有的"raw strings"
s in _T("raw string")
the _T
宏。当你使用char const*
或您的代码中的类似内容,而是使用TCHAR const*
.
包括一个执行相同操作的系统std::string
and std::cout
和别的char
based std
和其他库,或者在使用这些库时不与用户交互,并且在与窗口对话时使用A
终止接口char
or W
终止的接口函数wchar_t
基于字符串。
如今“回去”已经很少见了char
基于 Windows 上的界面,因此一种方法是取消宏并仅与W
直接基于接口。你的琴弦都变成了L"wide character"
, your std
东西就是全部std::wstring
等等,你的字符变量都是wchar_t
。这可能不被认为是最佳实践。
最后,请注意,两者char
and wchar_t
基于窄和宽的接口可以有多个char
or wchar_t
每个“字符”。当所有支持的窗口都是单一窗口时,对于窄窗口来说,情况并非如此。wchar_t
来自 UTF-16 的元素,以及多wchar_t
字符相对较少,因此很多代码无法处理这种可能性。