Могу ли я указать необходимую кодовую страницу для отдельной строковой переменной в окне `Watch1`?

Visual Studio 2015, язык C ++, отладка.

в Watch1 окно я смотрю значения моих переменных (строк) wchar_t* а также char* типы. Первый из них Unicode а второй ANSI (CP_OEMCP кодовая). в Watch1 окно текст wchar_t* переменная отображается правильно, но текст char* переменная отображается нечитаемым. Могу ли я указать необходимую кодовую страницу для отдельной строковой переменной в Watch1 окно? Я хочу видеть оба значения моих строк правильно в Watch1 окно.

Может быть, для таких случаев существует некоторый синтаксис, похожий на $err,hr (текст последней ошибки, полученной через GetLastError() функция).

UPD (экран добавлен)

введите описание изображения здесь

Окно консоли имеет правильный вывод, но в памяти и в Watch1 окно я вижу нечитаемую строку для моего ansiText переменная.

0

Решение

Проблема заключается в том, что исходная строка (начиная с шестнадцатеричных значений 8D A0 A6) находится не на кодовой странице Windows-1251 (Windows Cyrillic), а на кодовой странице OEM 866. Эти два отличны, и Visual Studio ожидает Windows-1251, потому что это кодовая страница системы (кодовая страница, используемая для приложений, не поддерживающих Юникод).

Невозможно указать кодовую страницу, когда вы смотрите строку в отладчике. Всё внутри должно быть в любом случае Unicode или, по крайней мере, UTF-8, и для этих двух есть спецификаторы формата, су а также s8. Увидеть MSDN для всех спецификаторов формата.

Что вы можете сделать, так это встроить в код следующую функцию, и когда вы хотите увидеть некоторую не-ANSI (или точнее не-CP_ACP) строку, просто вызовите эту функцию со строкой и кодовой страницей в качестве параметров (но используйте функция только один раз в окне просмотра):

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 с CodePage параметр = 866.

0

Другие решения

Других решений пока нет …