Я сделал простую программу, которая будет читать двоичный файл карты памяти PS1 и отображать его содержимое в консоли с помощью C ++ в Visual Studio. Названия игр кодируются в памяти в формате Shift-JIS, поэтому я использовал функцию MultiByteToWideChar для их преобразования:
// Converting Shift-JIS
char lTitle[65];
strcpy_s(lTitle, mymemcard[lFrame - 1].title);
int lTitleChars = MultiByteToWideChar(932, 0, lTitle, -1, NULL, 0);
wchar_t* lTitleL = new wchar_t[lTitleChars];
MultiByteToWideChar(932, 0, lTitle, -1, lTitleL, lTitleChars);
Моя проблема в том, что теперь я не могу получить переменную lTitleL для печати в приставка. Я пробовал cout, wcout, printf, wprintf, я не могу заставить их работать! Я знаю, что переменная lTitleL proiperly содержит заголовок, так как я вижу его в отладчике. Когда я вызываю любую из функций печати, которые я пробовал, просто ничего не печатается. Любая помощь будет оценена! Спасибо.
БОЛЬШОЕ РЕДАКТИРОВАНИЕ:
ОК, вот где я с этим:
// Converting Shift-JIS to UTF-8 //
///////////////////////////////////
// First, convert the multi-byte Shift-JIS format into wide characters
strcpy_s(lTitle, mymemcard[lFrame - 1].titleMB);
lTitleChars = MultiByteToWideChar(932, 0, lTitle, -1, NULL, 0);
wchar_t* lTitleFW = new wchar_t[lTitleChars];
MultiByteToWideChar(932, 0, lTitle, -1, lTitleFW, lTitleChars);
wprintf(L"FW, WriteConsoleW - ");
WriteConsoleW(consoleHandle, lTitleFW, lTitleChars, NULL, 0);
wprintf(L"\n");
// Memory card seems to store all characters in their "Full Width" forms, we need to convert them to Half-Width so they display nicely in the console
wchar_t* lTitleHW = new wchar_t[lTitleChars];
LCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_HALFWIDTH, lTitleFW, lTitleChars, lTitleHW, lTitleChars, NULL, NULL, 0);
wprintf(L"HW, WriteConsoleW - ");
WriteConsoleW(consoleHandle, lTitleHW, lTitleChars, NULL, 0);
wprintf(L"\n");
wprintf(L"HW, wprintf() - %s\n", lTitleHW);
// Now we can convert it into UTF-8 format to allow it to be printed using std::cout
// This step isn't necessary as we could call WriteConsoleW on lTitleHW instead, but why not
lTitleChars = WideCharToMultiByte(CP_UTF8, 0, lTitleHW, -1, NULL, 0, NULL, NULL);
char* lTitleUTF = new char[lTitleChars];
WideCharToMultiByte(CP_UTF8, 0, lTitleHW, -1, lTitleUTF, lTitleChars, NULL, NULL);
strcpy_s(mymemcard[lFrame - 1].titleUTF, lTitleUTF);
wprintf(L"UTF, wprintf() - %S\n\n", lTitleUTF);
delete[] lTitleFW;
delete[] lTitleHW;
delete[] lTitleUTF;
///////////////////////////////////
- MultiByteToWideChar, чтобы получить строку ввода Shift-JIS в широкий chars.
- Выведите это на консоль для отладки.
- Проблема теперь в том, что на карте памяти PS1 все символы хранятся в полноразмерных формах, поэтому я использую LCMapStringEX для их преобразования в полуширину. для более приятного вывода.
- Выведите это на консоль для отладки.
- Этого достаточно, если я с удовольствием использую WriteConsoleW, но если нет, то одна из проблем заключается в том, что определенные знаки препинания кодируются странно и не красиво печатать используя std :: wcout или wprintf (). Например, дефисы сохраняются как U + FF70 - «Полуширинная звуковая метка Katakana-Hiragana Prolonged Sound Mark» (после преобразования в половинную ширину), и они отображаются в виде вопросительных знаков независимо от используемого шрифта (однако они печатаются правильно используя WriteConsoleW).
- Итак, теперь я могу использовать WideCharToMultiByte, используя кодовую страницу UTF-8, чтобы получить версию строки, которая хорошо печатается на консоли, используя std :: wcout или wprintf (). Однако для правильной печати мне необходимо вызвать и SetConsoleCP (65001), и SetConsoleOutputCP (65001), в противном случае многобайтовые символы (такие как U + FF70, о которых я упоминал) печатаются побайтово.
- Наконец, для отображения любых необычных символов мне нужно выбрать шрифт, который может их отображать. Я обнаружил, что единственными шрифтами, которые работают со шрифтами по умолчанию в моей консоли, являются NSimSun и SimSun-ExtB, и ни один из остальных, похоже, не содержит японские символы (по крайней мере, для символа U + FF70).
Чтобы помочь визуализировать вывод этого, вот скриншот консоли, использующей шрифт NSimSun:
А здесь со шрифтом Consolas:
Теперь на мой вопрос: мне не особенно нравится шрифт NSimSun, есть ли другие, которые больше похожи на шрифт Consolas, которые содержат все символы для полной / половинной ширины японских символов? Если так, как я могу упаковать их в мое консольное приложение, чтобы оно было переносимым?
Спасибо!