doom2d.org

Главная база плоских морпехов
It is currently 23 Apr 2024, 21:34

All times are UTC + 3 hours




Post new topic Reply to topic  [ 4 posts ] 
Author Message
PostPosted: 14 Feb 2024, 18:20 
Offline
Приколист
User avatar

Joined: 17 Oct 2009, 19:57
Posts: 4016
Location: Киров
Некорректно отображаются названия папок и ресурсов в игре.

Image


_________________
Давай, картечью демонов
Размажем по стене.
Давай, берсерком выпустим
Весь ливер сатане!

Сделайте нормальный огнемёт! :evil:


Top
 Profile  
 
PostPosted: 14 Feb 2024, 22:07 
Offline
Приколист
User avatar

Joined: 04 Feb 2010, 14:42
Posts: 902
Location: Equestria
Только рисует криво? Загружает нормально?

Надо уточнить, не делает ли фпц конвертирование/детект кодировки за нас. А то может там двойная работа делается.
Если не детектит, то надо проверять LC_CTYPE на пинусах/никсах. На ведре и маке всегда можно форсить utf-8. Как там делается с виндой я хз, надо будет экспериментировать.


Top
 Profile  
 
PostPosted: 14 Feb 2024, 22:14 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 6680
Location: Владивосток
Очень хорошо, что ты выложил скрин, потому что теперь стало понятно то, чего не было понятно по сообщению в чате.
Такие строки (с большим количеством символов "Р") обычно появляются, если текст в 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 всей кодовой базы как таковой.

Ещё мысли вслух:

  1. {$MODESWITCH UNICODESTRINGS} - зло, потому что для подавляющего большинства задач достаточно обычных старых добрых ASCII-строк, а для многих из них хватило бы и вообще ShortString. Отсюда же следует, что -Sf UNICODESTRING - ещё большее зло, так как если первая штука хотя бы влияет только на модуль, в котором её указали, то вторая влияет на все модули, собираемые при данном запуске компилятора. То есть включая даже те, которые нам не следует как-либо править (библиотеки типа vampyre, заголовки и прочее).

  2. А поскольку безболезненно редактировать внешний код мы не можем, то SetMultiByteConversionCodePage() может пригодиться как раз для обеспечения его предсказуемого поведения в вопросе перегонки строк из Unicode и обратно, чтобы не зависеть от системных настроек пользователя.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 29 Feb 2024, 06:30 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 6680
Location: Владивосток
Чёрный Думер wrote:
1.{$MODESWITCH UNICODESTRINGS} - зло, потому что для подавляющего большинства задач достаточно обычных старых добрых ASCII-строк, а для многих из них хватило бы и вообще ShortString. Отсюда же следует, что -Sf UNICODESTRING - ещё большее зло, так как если первая штука хотя бы влияет только на модуль, в котором её указали, то вторая влияет на все модули, собираемые при данном запуске компилятора. То есть включая даже те, которые нам не следует как-либо править (библиотеки типа vampyre, заголовки и прочее).
Хотя нет, всё же этот подход не годится. Тезис-то верный, вот только проблема в том, что сам язык так не считает - компилятор FreePascal и его стандартная библиотека (RTL) отводят типу String ту же роль, которую в WinAPI играет тип TSTR и его разновидности (LPCTSTR и т.п.), то есть псевдонима либо для ANSI-типов, либо для Unicode - в зависимости от настроек сборки. К тому же, если мы хотим сохранить возможность собирать игру под Win9x (и под системы без Unicode как таковые), то нам придётся с этим соглашаться.

Поэтому теперь вырисовывается примерно такая схема использования типов, в порядке убывания предпочтительности:

  • FontString = type AnsiString(1251) - для непосредственного вывода текста на экран.
  • String / PChar / Char - для всех языковых строк, содержащих текст. Если сервер запущен на ANSI-системе, то в серверлисте об этом должна быть пометка.
  • String[] - для всех технических строк. Явное указание максимальной длины должно быть обязательным, так как оно уточняет по месту смысл употребления.
  • RawByteString - для всех тех редких случаев, когда не хватило ограничения String[] на максимум в 255 символов длины, а также для "сырой" работы с текстовыми данными.

  • UnicodeString / PUnicodeChar / UnicodeChar - для работы с Unicode и случаев, где он подразумевается однозначно (например на сервер что-то отправить).
  • UTF8String / PUTF8Char / UTF8Char - для сериaлизации Unicode в нечто более компактное или его маршалинга туда, где требуется именно UTF-8 (многие API современных библиотек такие).
  • AnsiString / PAnsiChar / AnsiChar - для работы с ANSI-кодировкой в случаях, когда это необходимо (скажем, в какую-нибудь старую библиотеку прокинуть что-нибудь).

  • UCS4String / UCS4Char / TUCS4CharArray - если вдруг потребовалось работать с чистыми Unicode-символами без суррогатных пар и прочей мути.
  • WideString / PWideChar / WideChar - для работы с Component Object Model и производными от COM технологиями (вообще не могу себе представить, но вдруг).
  • ShortString (синоним к String[255]) - если требуется заранее выделенная на стеке строка. Нужно сугубо для обработки исключений, так как они могут предполагать повреждение кучи.

Есть весьма годная брошюрка от Embarcadero, где описывается смысл введения в Delphi тех или иных строковых типов:
https://www.embarcadero.com/images/dm/technical-papers/delphi-and-unicode-marco-cantu.pdf

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 4 posts ] 

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
doom2d.org, since 2005