Visual Studio 2015,C ++语言,调试。
在spaceShip(mouseX, mouseY);
窗口中,我查看了Watch1
和wchar_t*
类型的变量(字符串)的值。第一个是char*
,第二个是Unicode
(ANSI
代码页)。在CP_OEMCP
窗口中,Watch1
变量的文本正确显示,但wchar_t*
变量的文本显示不可读。我可以在char*
窗口中为单个字符串变量指定必要的代码页吗?我希望在Watch1
窗口中正确查看我的字符串的两个值。
也许对于这种情况存在一些语法,类似于Watch1
(最后一个错误的文本,它是通过$err,hr
函数获得的)。
UPD (添加了屏幕)
控制台窗口输出正确,但在内存和GetLastError()
窗口中,我看到Watch1
变量的字符串不可读。
答案 0 :(得分:0)
问题是原始字符串(以十六进制值8D A0 A6开头)不在Windows-1251(Windows Cyrillic)代码页上,而是在OEM 866代码页上。这两者是不同的,Visual Studio期望Windows-1251,因为该系统的代码页(用于非Unicode应用程序的代码页)。
在调试器中查看字符串时,无法指定代码页。无论如何,内部的所有内容都应该是Unicode,或者至少是UTF-8,对于这两者,有格式说明符, su 和 s8 。有关所有格式说明符,请参阅MSDN。
您可以做的是在代码中集成以下功能,当您想要查看某些非ANSI(或非CP_ACP,准确)字符串时,只需使用字符串和代码页作为参数调用此函数(但在Watch窗口中仅使用该功能一次):
LPCWSTR ViewString(LPCSTR szString, UINT nCodePage)
{
static WCHAR szTemp[1024];
MultiByteToWideChar(nCodePage, 0, szString, -1, szTemp, 1024);
return szTemp;
}
因此,在Watch窗口而不是(char*)ansiText
的情况下,会有ViewString(ansiText, 866)
。另请注意,这实际上不是" ANSI文本",而是" OEM文本"。
我不知道你的程序到底应该做什么,但是我会在代码的最早点将所有非Unicode字符串转换为Unicode(在你获得非Unicode字符串的地方),并且您的代码始终只使用Unicode字符串。要将OEM 866字符串转换为Unicode,您可以使用MultiByteToWideChar
参数= 866的函数CodePage
。