C++ C3872 MFC字符串转换

C++ C3872 MFC字符串转换,c++,mfc,C++,Mfc,给定以下代码: CA2T strñ("ñ"); CA2T strñ("Ñ"); 不确定为什么不针对该字符编译,但可用于: CA2T stradiaeresis("Ä"); CA2T strodiaeresis("Ö"); CA2T strudiaeresis("Ü"); “0xb1”:标识符中不允许使用此字符 有没有办法解决这个问题?如中所述,您在标识符strñ中使用了非法字符。法律性质的范围记录在本主题下 要使代码编译,您必须使用合法的标识符名称,例如 CA2T str_latin_sma

给定以下代码:

CA2T strñ("ñ");
CA2T strñ("Ñ");
不确定为什么不针对该字符编译,但可用于:

CA2T stradiaeresis("Ä");
CA2T strodiaeresis("Ö");
CA2T strudiaeresis("Ü");
“0xb1”:标识符中不允许使用此字符

有没有办法解决这个问题?

如中所述,您在标识符
strñ
中使用了非法字符。法律性质的范围记录在本主题下

要使代码编译,您必须使用合法的标识符名称,例如

CA2T str_latin_small_letter_n_with_tilde("ñ");
CA2T str_latin_capital_letter_n_with_tilde("Ñ");
虽然这使代码得以编译,但有几个问题需要解决:

  • CA2T
    表示其源类型的ANSI(代码页)编码。使用ANSI编码通常是不可取的
  • CA2T
    转换宏指定一个
    TCHAR
    作为其目标类型。这在今天从来没有用过。当Windows 98发布时,该功能不再有用
  • 使用ANSI编码。同样,ANSI编码是不受欢迎的,因为它受到限制,并且在迁移到运行在不同语言环境中的编译器时可能会改变其含义
如果你的愿望清单上的惊喜很低,请考虑将代码更改为以下内容:

CStringW str_latin_small_letter_n_with_tilde(L"ñ");
CStringW str_latin_capital_letter_n_with_tilde(L"Ñ");

这样做会显式地请求Unicode字符编码(在VisualStudio中为UTF-16 LE)。在绝大多数情况下,这是您想要的。

strñ
这是它不喜欢的标识符中的
ñ
。有关完整的定义,请参见:Windows是UTF-16,因此如果您使用UTF-8源文件,它可能会非常不安。此外,在同一范围内不能有两个同名的变量。@RichardCriten:源代码与操作系统不交互。它被编译器消化,VisualStudio将乐于阅读UTF-8编码的源文件。您已经发布了一个链接,指向解释,包括解决方案。你为什么决定不看它?@IInspectable可能是因为我需要使用它,而解决方法是不使用它,因为它超出了范围?很有趣。当我一直在使用
tinyxml2
库时,我总是这样做,因为这是我唯一想到的工作:
LPCTSTR szAssistant=CA2CT(pAttrAssistant->Value(),CP_UTF8)
@andrewruckle:这应该是
LPCWSTR
CA2CW
,也就是说,它不应该依赖于通用文本映射。您发布的代码段也不依赖于ANSI编码。它专门命名源字符编码,并且使用UTF-8是明确的,不像ANSI编码。可以在不同的Unicode编码之间进行转换;两种编码都可以表示相同的代码点范围。我现在有太多调用
CA2CT
来更改它们。但是谢谢你提供的信息。@I非常感谢你扩展了答案,我误解了它的意思。我知道它不能在字符串文本中使用,而不能在变量名中使用。