C++ Windows NT二进制可执行文件内部常量字符串编码

C++ Windows NT二进制可执行文件内部常量字符串编码,c++,unicode,encoding,windows-nt,C++,Unicode,Encoding,Windows Nt,Windows NT在整个Windows NT API中使用Unicode(两个字节宽的UTF-16)作为默认编码方法。如果选择使用ASCII或多字节字符集作为默认字符集,则它们会将ASCII转换为Unicode。而使用ASCII字符集将比使用Unicode慢。 这种转变意味着什么?他们只将ASCII API转换为Unicode API,还是转换所有字符串? 例如: 如果使用const char*text=“Hello,world!”创建一个C/C++文件。在Windows NT上编译时,编译的

Windows NT在整个Windows NT API中使用Unicode(两个字节宽的UTF-16)作为默认编码方法。如果选择使用ASCII或多字节字符集作为默认字符集,则它们会将ASCII转换为Unicode。而使用ASCII字符集将比使用Unicode慢。 这种转变意味着什么?他们只将ASCII API转换为Unicode API,还是转换所有字符串? 例如:
如果使用
const char*text=“Hello,world!”
创建一个C/C++文件。在Windows NT上编译时,编译的二进制文件是否将“Hello,world!”存储为Unicode(26字节)或ASCII(13字节)?

您必须决定使用哪种API版本:ANSI或Unicode。要么显式使用函数(如CreateFileA代表ANSI,CreateFileW代表Unicode),要么使用不带“A”或“W”的函数名,并且_Unicode预处理器变量决定使用这两个函数中的哪一个。某些函数需要包含字符串的结构。这些结构还有两个版本(如OSVersionInfo和OSVersionInfo)。现在没有理由这么做

但这只适用于参数,而不适用于内容。如果使用指向数据及其大小的指针将字符串写入文件,则不会进行转换


回答您的问题:因为您显式使用了
char
,它占用了13个字节。如果您使用了
wchar
,它将使用26个字节。您可以编写
consttchar*text=\u T(“你好,世界!”)编译器不会更改字符串的类型。它将在您声明它们时对它们进行编码

Windows NT及其后续版本(2000、XP、2003、Vista、7、8、8.1、10)在内部使用2字节字符(称为“宽字符”)。使用Windows NT进行编码;从Windows 2000开始,它切换到
UTF-16LE

对于处理字符串的大多数API函数,它们有两个不同的版本;处理ANSI字符串的名称以
A
结尾,另一个名称以
W
结尾(“W”来自“宽字符”)。一组宏定义将不带后缀的名称映射到
A
W
版本。选择由名为
\u UNICODE
的宏驱动。但是,如果情况需要,程序员可以自由地直接调用
A
W
函数

为了帮助开发人员处理宽字符串,Microsoft提供的标准C库包含一组用于处理宽字符串的函数(相当于
strlen()
strcat()
a.s.o)。他们的名字通常由
str
替换为
wcs

程序员决定使用每个函数的哪个版本。大多数情况下,不需要转换编码(只要您坚持使用上述其中一种)。但是,有些子系统没有选项:您必须将字符串转换为Unicode以使其工作

您可以阅读有关Windows如何处理API中字符串的更多信息:


要回答您的问题,Windows不会更改字符串。它仅在内部将字符串从ANSI转换为Unicode,以传递给其API函数的
A
版本。它还可以将Unicode转换回ANSI(如果可能的话),即API函数的
A
版本返回的字符串(,例如)。

实际上,WinNT使用UCS-2,Microsoft在Win2000中切换到UTF-16时,“A”表示ANSI,而不是ASCII。ANSI是在API调用时为线程选择的代码页。@RemyLebeau您是对的。我更新了答案。谢谢你。@TomBlodget你说得对。问题中的“ASCII”深深地印在我的脑海中,并在回答中找到了它的方式。我现在改正了。非常感谢。