我可以为 `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
,第二个是 ANSI
(CP_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,对于这两个格式说明符,su 和 s8。有关所有格式说明符,请参阅 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,您可以使用函数 MultiByteToWideChar
和 CodePage
参数 = 866.
Visual Studio 2015年,C++语言,调试。
在 Watch1
window 中,我查看 wchar_t*
和 char*
类型的变量(字符串)的值。第一个是 Unicode
,第二个是 ANSI
(CP_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,对于这两个格式说明符,su 和 s8。有关所有格式说明符,请参阅 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,您可以使用函数 MultiByteToWideChar
和 CodePage
参数 = 866.