Visual Studio 2015, язык C ++, отладка.
в Watch1
окно я смотрю значения моих переменных (строк) wchar_t*
а также char*
типы. Первый из них Unicode
а второй ANSI
(CP_OEMCP
кодовая). в Watch1
окно текст wchar_t*
переменная отображается правильно, но текст char*
переменная отображается нечитаемым. Могу ли я указать необходимую кодовую страницу для отдельной строковой переменной в Watch1
окно? Я хочу видеть оба значения моих строк правильно в Watch1
окно.
Может быть, для таких случаев существует некоторый синтаксис, похожий на $err,hr
(текст последней ошибки, полученной через GetLastError()
функция).
UPD (экран добавлен)
Окно консоли имеет правильный вывод, но в памяти и в Watch1
окно я вижу нечитаемую строку для моего ansiText
переменная.
Проблема заключается в том, что исходная строка (начиная с шестнадцатеричных значений 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.
Других решений пока нет …