【问题标题】:Are L'A' and 'A' totally same?L'A'和'A'完全一样吗?
【发布时间】:2023-03-15 03:17:02
【问题描述】:

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

但是,字符也需要包装这个宏吗?

L'A' 和 'A' 完全一样吗?
我们不需要为字符包装 _T('A') 吗?

【问题讨论】:

    标签: c++ unicode char


    【解决方案1】:

    不,L'A' 是 wchar_t 类型的 Unicode 字符,而 'A' 是 char 类型的 ASCII 字符。这是字符串文字上的MSDN

    【讨论】:

    • 'A' 不一定是 ASCII,L'A' 不一定是 unicode。
    • 是的,L'A' 不一定是 unicode。但是我不明白“'A'不一定是ASCII”是什么意思。
    • 这意味着,“'A'(通常是 char 类型)不一定是 ASCII”。例如,它可能是 EBCDIC。但不是在 Microsoft 编译器上,因为您在问题中提到了 _T,这就是 Johannes(合理地是 IMO)所说的。
    【解决方案2】:

    如果您编写 '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
    • 假设你的理解是正确的,我在C++标准中还是无法真正找到它,无论是在可执行宽字符集的定义中,还是在宽字符的定义中字面量,或wchar_t 的定义。并不意味着它不存在。
    • POSIX 标准要求窄字符和宽字符对于 POSIX 可移植字符集中的字符具有相同的数值。因此,虽然 L'A' == (wchar_t)'A' 是有保证的,但 L'€' == (wchar_t)'€' 不是。
    • 我不同意重载函数以获取 char 和 wchar_t 应该做同样的事情。如果我想将文件的内容读入 char 字符串,我只会读它。如果我想将文件的内容读入 wchar_t,我必须对其进行解码,因为没有人使用 UTF-16。
    • @dan04。您无法将文件的内容读入wchar_t。我所说的charwchar_t 上的重载仅适用于我所说的,不适用于char*wchar_t* 上的重载。但是例如std::isspace 应该为代表“相同字符”的charwchar_t 返回相同的值。对 POSIX 可移植字符集的要求排除了 EBCDIC 系统,但对宽字符使用 unicode。因此,提议从 C99 中删除等效限制,前提是实现集 __STDC_BTOWC_NEQ_WCTOB__,如上面 AProgrammer 的链接中所示。
    【解决方案3】:

    L'A' 是 wchar_t,'A' 是 char。它们是不同的类型,也有不同的大小。

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

    【讨论】:

    • L'A' 在我的平台上是四个字节。
    【解决方案4】:

    _T 是 Visual Studio 中的宏,如果在项目的属性中字符集属性设置为“使用多字节字符”,_T 将替换为空字符串,如果设置为“使用 Unicode 字符集”,_T 将是换成L。 该宏是为从 Unicode->ASCII 字符集简单转换项目而定义的,无需任何额外更改

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 2019-11-13
      • 1970-01-01
      • 2013-11-14
      • 2017-04-06
      相关资源
      最近更新 更多