我可以为 `Watch1` window 中的单个字符串变量指定必要的代码页吗?

Can I point the necessary codepage for the individual string variable in the `Watch1` window?

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

Watch1 window 中,我查看 wchar_t*char* 类型的变量(字符串)的值。第一个是 Unicode,第二个是 ANSICP_OEMCP 代码页)。在 Watch1 window 中,wchar_t* 变量的文本显示正确,但 char* 变量的文本显示不可读。我可以为 Watch1 window 中的单个字符串变量指定必要的代码页吗?我想在 Watch1 window.

中正确查看我的字符串的两个值

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

UPD(添加的画面)

控制台 window 具有正确的输出,但在内存和 Watch1 window 中,我看到 ansiText 变量的字符串不可读。

问题在于原始字符串(以十六进制值 8D A0 A6 开头)不在 Windows-1251(Windows 西里尔文)代码页上,而是在 OEM 866 代码页上。这两个是不同的,Visual Studio 期望 Windows-1251,因为那是系统的代码页(用于非 Unicode 应用程序的代码页)。

在调试器中查看字符串时无法指定代码页。无论如何,里面的所有内容都应该是 Unicode,或者至少是 UTF-8,对于这两个格式说明符,sus8。有关所有格式说明符,请参阅 MSDN

你可以做的是在代码中集成以下函数,当你想查看一些非 ANSI(或 non-CP_ACP,准确地说)字符串时,只需使用字符串调用此函数即可代码页作为参数(但在 Watch window 中仅使用该函数一次):

LPCWSTR ViewString(LPCSTR szString, UINT nCodePage)
{
    static WCHAR szTemp[1024];
    MultiByteToWideChar(nCodePage, 0, szString, -1, szTemp, 1024);
    return szTemp;
}

因此,在您的情况下,Watch window 而不是 (char*)ansiText 会有 ViewString(ansiText, 866)。另外请注意,这实际上不是 "ANSI text",而是 "OEM text".

我不知道你的程序究竟应该做什么,但我会在代码的最早点(就在你获得非 Unicode 字符串的地方)将所有非 Unicode 字符串转换为 Unicode,并在您的代码始终仅适用于 Unicode 字符串。要将 OEM 866 字符串转换为 Unicode,您可以使用函数 MultiByteToWideCharCodePage 参数 = 866.