将西里尔文字指定给CString 我正在使用MFC和Visual C++库的遗留代码。我需要创建一个CString向量,该向量可以容纳西里尔文字,如以下示例代码片段所示: std::vector<CString> vecContainingCyrillicWords; vecContainingCyrillicWords.push_back(_T("English Words")); vecContainingCyrillicWords.push_back(_T("Русские слова")); 包含西里尔词的向量向量; 包含西里尔词的向量。向后推(英文词); 包含西里尔文字的向量。向后推(_T(“ПааСаааа”);

将西里尔文字指定给CString 我正在使用MFC和Visual C++库的遗留代码。我需要创建一个CString向量,该向量可以容纳西里尔文字,如以下示例代码片段所示: std::vector<CString> vecContainingCyrillicWords; vecContainingCyrillicWords.push_back(_T("English Words")); vecContainingCyrillicWords.push_back(_T("Русские слова")); 包含西里尔词的向量向量; 包含西里尔词的向量。向后推(英文词); 包含西里尔文字的向量。向后推(_T(“ПааСаааа”);,c++,visual-c++,mfc,c-strings,C++,Visual C++,Mfc,C Strings,问题:如下面的调试结果所示,西里尔字母没有正确设置。如何将西里尔文字指定给类型为CString的变量 调试器没有正确显示它并不意味着它没有被正确分配给CString CString中的确切内容取决于您是否设置了Unicode。检查是否在编译时定义了MBCS符号或UNICODE符号。如果不是Unicode,字符是单字节ASCII值,当您想要显示/打印字符时,必须确保使用正确的代码页。调试器似乎错误地显示了非英语字符,可能将Unicode解释为单字节字符,或者根据欧洲代码页(可能是1252)而不是支

问题:如下面的调试结果所示,西里尔字母没有正确设置。如何将西里尔文字指定给类型为
CString
的变量


调试器没有正确显示它并不意味着它没有被正确分配给
CString


CString
中的确切内容取决于您是否设置了Unicode。检查是否在编译时定义了MBCS符号或UNICODE符号。如果不是Unicode,字符是单字节ASCII值,当您想要显示/打印字符时,必须确保使用正确的代码页。调试器似乎错误地显示了非英语字符,可能将Unicode解释为单字节字符,或者根据欧洲代码页(可能是1252)而不是支持西里尔文的代码页(通常是1251)解释单字节字符的高ASCII值。后一种可能性在我看来是一样的,但如果不知道您是否定义了Unicode,我就无法确定。

问题在于文件编码类型。该文件已使用
utf-8
编码保存,因此,我希望得到正确的结果。但是我必须将文件编码更改为
UTF8 with BOM
,然后将正确的值推送到向量


也由@Simon Mourier在上面的评论中提出

CString
的具体类型是什么?
\u T
扩展到什么?当您在命令行上定义预处理器符号
\u CSTRING\u禁用\u窄\u宽\u转换
时,代码是否仍在编译?只有当您将操作系统设置为西里尔字母代码页或使用
-D\u UNICODE
构建应用程序(或两者兼而有之)时,代码才能运行。我不会重现您的问题(Visual Studio 2019):但请确保源文件是以支持unicode的格式保存的,例如UTF8和BOM。转到“项目属性”,将“字符集”设置为unicode。但是,如果修改现有的ANSI项目,您可能会遇到其他问题。“如果不是Unicode,字符是单字节ASCII值”-不,不是ASCII。这些假设是ANSI。虽然Microsoft的CRT支持(ASCII、ANSI、Unicode),但MFC的
CString
无法区分ANSI和ASCII,并假定ANSI.IIRC、ASCII(包括扩展ASCII)(即最多255,而不是127)和ANSI是表示同一事物的不同方式。如果您查找“ASCII代码页1252”或“ANSI代码页1252”,您将得到相同的结果。不,它们不是。ASCII是一种字符编码,它将意义严格地分配给数值0到127。在CRT中,只有少数函数需要区分ASCII和ANSI(或代码页编码),微软的实现通过支持所有3个字符集来确认这一点。只要搜索“扩展ASCII”,你就会明白我的意思。此外,请看下面关于公认答案的一条评论:,其中他说,“术语“ANSI”在应用于Microsoft的8位代码页时用词不当。它们基于为ANSI标准化而提交的草案,但ANSI本身从未对其进行标准化。”您可以在这里看到扩展ASCII(有一些解释)。等等。无论如何,这是一个语义讨论,对帮助OP解决问题几乎没有影响。你应该提到是谁给了你这个想法。@SimonMourier:事实上,我自己只是在尝试不同的编码。但现在我看到你在一篇评论中也提出了这个想法,所以我更新了我的答案,并提到你:)