【发布时间】:2023-03-15 03:17:02
【问题描述】:
当我们编写一个同时支持 unicode 和多字节的程序时,
我们经常对字符串使用 _T("some string") 宏。
但是,字符也需要包装这个宏吗?
L'A' 和 'A' 完全一样吗?
我们不需要为字符包装 _T('A') 吗?
【问题讨论】:
当我们编写一个同时支持 unicode 和多字节的程序时,
我们经常对字符串使用 _T("some string") 宏。
但是,字符也需要包装这个宏吗?
L'A' 和 'A' 完全一样吗?
我们不需要为字符包装 _T('A') 吗?
【问题讨论】:
不,L'A' 是 wchar_t 类型的 Unicode 字符,而 'A' 是 char 类型的 ASCII 字符。这是字符串文字上的MSDN。
【讨论】:
'A'(通常是 char 类型)不一定是 ASCII”。例如,它可能是 EBCDIC。但不是在 Microsoft 编译器上,因为您在问题中提到了 _T,这就是 Johannes(合理地是 IMO)所说的。
如果您编写 'A',并且该值被转换为 wchar_t,那么至少在 Microsoft 编译器上,它将具有与您编写 L'A' 或 _T('A') 相同的值。
对于字符串文字则不能这样说,因为没有从const char* 到const wchar_t* 的有用转换。我认为这意味着获得正确的字符文字类型不如字符串文字重要。
根据字符文字是宽还是窄,编写行为不同的代码很容易——只需有一个重载函数来完成完全不同的事情。但在实践中,重载以获取这两种类型的字符的明智函数最终会用'A' 做同样的事情,就像他们用L'A' 做的一样。而没有重载的函数,只取wchar_t,可以取'A'就好了。
我没有立即在标准中看到任何要求 L'A' == (wchar_t)'A' 的内容,因此理论上非 Microsoft 编译器可能会做一些完全不同的事情。但是您通常希望宽字符集是窄字符集的扩展,就像 Unicode 扩展 ISO-8859-1 一样。具体而言,“扩展”是什么意思,与整数相等的代码点表示“相同的字符”。
【讨论】:
L'A' == (wchar_t)'A' 在 C 和 C++ 中都是强制性的。如果__STDC_MB_MIGHT_NEQ_WC__ 为1,则该约束在C 中不再成立(从TC2 开始,TC3 中已修改了一些细节)。C++0X 导入C TC3 解决方案。有关 C 的讨论,请参阅 open-std.org/jtc1/sc22/wg14/www/docs/dr_321.htm
wchar_t 的定义。并不意味着它不存在。
wchar_t。我所说的char 与wchar_t 上的重载仅适用于我所说的,不适用于char* 与wchar_t* 上的重载。但是例如std::isspace 应该为代表“相同字符”的char 和wchar_t 返回相同的值。对 POSIX 可移植字符集的要求排除了 EBCDIC 系统,但对宽字符使用 unicode。因此,提议从 C99 中删除等效限制,前提是实现集 __STDC_BTOWC_NEQ_WCTOB__,如上面 AProgrammer 的链接中所示。
L'A' 是 wchar_t,'A' 是 char。它们是不同的类型,也有不同的大小。
您应该使用 _T('A'),如果定义了 _UNICODE 宏,则将 L 添加到文字中。
【讨论】:
_T 是 Visual Studio 中的宏,如果在项目的属性中字符集属性设置为“使用多字节字符”,_T 将替换为空字符串,如果设置为“使用 Unicode 字符集”,_T 将是换成L。 该宏是为从 Unicode->ASCII 字符集简单转换项目而定义的,无需任何额外更改
【讨论】: