我可以在“Watch1”窗口中为单个字符串变量指定必要的代码页吗?

时间:2015-10-02 13:33:01

标签: c++ visual-studio ansi codepages

Visual Studio 2015,C ++语言,调试。

spaceShip(mouseX, mouseY); 窗口中,我查看了Watch1wchar_t*类型的变量(字符串)的值。第一个是char*,第二个是UnicodeANSI代码页)。在CP_OEMCP窗口中,Watch1变量的文本正确显示,但wchar_t*变量的文本显示不可读。我可以在char*窗口中为单个字符串变量指定必要的代码页吗?我希望在Watch1窗口中正确查看我的字符串的两个值。

也许对于这种情况存在一些语法,类似于Watch1(最后一个错误的文本,它是通过$err,hr函数获得的)。

UPD (添加了屏幕)

enter image description here

控制台窗口输出正确,但在内存和GetLastError()窗口中,我看到Watch1变量的字符串不可读。

1 个答案:

答案 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