Яндекс.Метрика

    Подсознание

    Записки локализатора. Дело о проблеме с сохранением в играх

    «У меня игра не сохраняется! Что делать?!!!»
    crazyLooker
    «У меня все сохраняет.»
    vampire
    «сейвы не работают, что за фигня?»
    zombie
    «Все работает, у кого-то просто кривые руки :)»
    dante
    Из форумов по играм…

    Иногда такие перепалки растягиваются на несколько страниц, и если бы участники словесных баталий встретились в реале, наверняка не обошлось бы без мордобоя.
    В чем же кроется секрет, что у одних все работает, а у других, честно купленный лицензионный диск радует невозможностью сохранить с таким трудом достигнутые результаты?
    Все очень просто. Русский язык и Windows. Все современные игры, согласно правилам работы с пользовательскими данными, делают сохранения результатов в каталоге пользователя. Обычно это папка «Мои Документы» который находится в персональном каталоге пользователя. Вот тут то и начинается проблема, и даже две. Во первых, в русской версии Windows имя папки «Мои Документы» на русском языке, в отличии от английского варианта «My Documents». Во вторых, пользователь создавая свой профиль в Windows мог написать его используя русские или другие кириллические символы. Что, в принципе, вполне логично если это родной язык.
    В итоге наша игра «Blablabla Game» будет пытаться сохранять достижения в такой папке «Documents and Settings\Вася Пупкин\Мои Документы\Blablabla Game\Saves»
    Проблема же заключается в том, что западные разработчики игр, часто даже не догадываются что путь куда они собираются сохранять файл может содержать какие либо символы отличные от стандартного набора ASCII.
    Копнем внутрь кода.
    Каталог пользователя получается обычно функцией SHGetKnownFolderPath. Если повезло и разработчик использовал Unicode версию функции то на выходе получится правильная Unicode строка. Но вот дальше, начинаются приколы. Потому что разработчики работают с этой строкой совершенно без учета кодировки текста, часто считая что это обычные английские буквы.
    Unicode символы содержат 2 байта на каждый символ. Вот как выглядит строка в 16-ричном представлении:

    FEFF 0022 0043 003A-005C 0044 006F 0063-0075 006D 0065 006E-0074 0073 0020 0061 ?"C:\Documents a
    006E 0064 0020 0053-0065 0074 0074 0069-006E 0067 0073 005C-0412 0430 0441 044F nd Settings\Вася
    0020 043F 0443 043F-043A 0438 043D 005C-041C 043E 0438 0020-0414 043E 043A 0443 пупкин\Мои Доку
    043C 0435 043D 0442-044B 0022 0020 000D-000A 0000 0000 0000 0000 0000 0000 0000 менты"