C++ 是L';A';和';A';完全一样?

C++ 是L';A';和';A';完全一样?,c++,unicode,char,C++,Unicode,Char,当我们编写一个同时支持unicode和多字节的程序时, 我们经常对字符串使用_T(“some string”)宏 但是,角色是否也需要包装此宏 L'A'和'A'完全一样吗? 我们不需要为字符换行吗?不,L'A'是wchar\u t类型的unicode字符,而'A'是char类型的ASCII字符。这是关于字符串的文本。L'A'是一个wchar\u t,'A'是一个字符。它们的类型不同,大小也不同 您应该使用_T('A'),如果定义了_UNICODE宏,它会将L添加到文字中。\u T是Visual

当我们编写一个同时支持unicode和多字节的程序时,
我们经常对字符串使用_T(“some string”)宏

但是,角色是否也需要包装此宏

L'A'和'A'完全一样吗?

我们不需要为字符换行吗?

不,L'A'是
wchar\u t
类型的unicode字符,而'A'是
char
类型的ASCII字符。这是关于字符串的文本。

L'A'是一个wchar\u t,'A'是一个字符。它们的类型不同,大小也不同


您应该使用_T('A'),如果定义了_UNICODE宏,它会将L添加到文字中。

\u T是Visual Studio中的宏,如果在项目的属性中,字符集属性集设置为“使用多字节字符”\u T将替换为空字符串,如果设置为“使用UNICODE字符集”\u T将替换为L。
此宏是为从Unicode->ASCII字符集简单转换project而定义的,无需任何其他更改

如果您编写
'A'
,并且该值被转换为
wchar\t
,那么至少在Microsoft编译器上,它将具有与编写
L'A'
\u t('A')
时相同的值

对于字符串文本来说,情况并非如此,因为从
const char*
const wchar\u t*
没有任何有用的转换。我认为这意味着正确的字符文本类型比正确的字符串文本更不重要

很容易编写根据字符文字是宽还是窄而表现不同的代码——只要有一个重载函数来完成完全不同的操作即可。但在实践中,重载以接受这两种类型字符的合理函数最终将对
'A'
执行与对
L'A'
相同的操作。而没有重载的函数,只接受
wchar\u t
,可以接受
'A'
很好


我没有立即在标准中看到任何要求
L'A'==(wchar_t)'A'
的内容,因此理论上非微软编译器可能会做一些完全不同的事情。但您通常希望宽字符集是窄字符集的扩展,就像Unicode扩展ISO-8859-1一样。具体来说,“扩展名”的含义是,与整数相等的代码点表示“相同的字符”。

'A'不一定是ASCII,L'A'不一定是unicode。是的,L'A'不一定是unicode。但我不明白“'A'不一定是ASCII”是什么意思。它的意思是“
'A'
(通常
char
类型)不一定是ASCII”。例如,它可能是EBCDIC。但在微软编译器上,这是Johannes(合理的IMO)所谈论的,因为你提到了代码> > t>代码,我的平台上有四字节。我的理解是,在C++和C++中有一个“<代码> L'A'=(W查尔图)”。如果
\uu STDC\u MB\u may\u NEQ\u WC\uu
为1,则约束在C中不再有效(因为TC2,一些细节在TC3中已被修改)。C++0X导入C TC3解决方案。对于C讨论,假设假设您的理解正确,我仍然不能在C++标准中找到它,无论是在可执行的宽字符集的定义、宽字符文字的定义,还是“代码> W查理t ”的定义中。POSIX标准要求窄字符和宽字符与POSIX可移植字符集中的字符具有相同的数值。因此,虽然L'A'==(wchar__t)'A'是有保证的,但L'€'=(wchar_t)'€'不是。我不同意重载以获取char和wchar_t的函数应该做同样的事情。如果我想把一个文件的内容读入一个字符字符串,我就直接读它。如果我想把一个文件的内容读入一个wchar\u t,我必须对它进行解码,因为没有人使用UTF-16。@dan04。无法将文件内容读入
wchar\t
。我所说的
char
vs.
wchar\u t
上的重载只适用于我所说的,不适用于
char*
vs
wchar\u t*
上的重载。但例如,
std::isspace
应该为表示“相同字符”的
char
wchar\u t
返回相同的字符。关于POSIX可移植字符集的这一要求排除了EBCDIC系统的可能性,但宽字符使用unicode。因此,建议删除C99中的等效限制,前提是实现集
\uuuuuStdc\uBtowc\uNEQ\uWCTOB\uuuuu
,如上面的程序链接所示。