Очень хорошо, что ты выложил скрин, потому что теперь стало понятно то, чего не было понятно по
сообщению в чате.
Такие строки (с большим количеством символов "Р") обычно появляются, если текст в UTF-8 выводится как будто бы он в однобайтовой ANSI-кодировке.
Буквально позавчера человек с похожей проблемой просил помощи в разделе техподдержки нашего Discord-канала, где он
показал вот такой лог:
Code:
CON: Doom 2D: Forever version 0.667 proto 188
CON: Build arch: x86 32-bit sse
CON: Build date: 2024/02/11 15:57:46
CON: Build hash: b630b2f493a20e331c16cbd04bb1eaf432f337d4
CON: Build by: SweetieBot
CON: Force bin dir: false
CON: MapDownloadDirs:
CON: C:\Users\EvgeI\OneDrive\??????? ????\????? ?????\maps\downloads
CON: C:\Users\EvgeI\AppData\Roaming\doom2df\maps\downloads
CON: WadDownloadDirs:
CON: C:\Users\EvgeI\OneDrive\??????? ????\????? ?????\wads\downloads
CON: C:\Users\EvgeI\AppData\Roaming\doom2df\wads\downloads
CON: FATAL: WAD GAME not found in data directories.
Вопросительные знаки в путях означают, что где-то побилась кодировка. Хотя, конечно, дело может быть просто в том, что он прямиком из консоли текст копировал. У него при этом русская Windows 10, однако он признался, что ставил себе английский языковой пакет. Так что пока это всё же самое логичное предположение о причине ошибки.
По поводу консоли - вероятно, стоит поиграться с
SetTextCodePage() и выставлять принудительно ей кодировку в 1251. По поводу строк - можно, конечно, врубить нечто вроде
SetMultiByteConversionCodePage(). Но если поступать по уму, то надо сделать как я
вот здесь описывал. Однако это имеет смысл делать лишь вместе с преобразованием в UTF-8 всей кодовой базы как таковой.
Ещё мысли вслух:
- {$MODESWITCH UNICODESTRINGS} - зло, потому что для подавляющего большинства задач достаточно обычных старых добрых ASCII-строк, а для многих из них хватило бы и вообще ShortString. Отсюда же следует, что -Sf UNICODESTRING - ещё большее зло, так как если первая штука хотя бы влияет только на модуль, в котором её указали, то вторая влияет на все модули, собираемые при данном запуске компилятора. То есть включая даже те, которые нам не следует как-либо править (библиотеки типа vampyre, заголовки и прочее).
- А поскольку безболезненно редактировать внешний код мы не можем, то SetMultiByteConversionCodePage() может пригодиться как раз для обеспечения его предсказуемого поведения в вопросе перегонки строк из Unicode и обратно, чтобы не зависеть от системных настроек пользователя.