Pull to refresh

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

Reading time3 min
Views5.8K
«У меня игра не сохраняется! Что делать?!!!»
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 менты" ♪◙


Ошибка кроется в последующей обработке этой строки. Часто разработчики, видимо используя старый код, преобразовывают 2х байтовую Unicode строку в однобайтовую ASCII для дальнейшей работы. И часто это делают с ошибкой. Например так, без учета кодировки.
.text:00A3BBE0 mov edx, [esp+unicodeSrc]
.text:00A3BBE4 mov al, [edx]
.text:00A3BBE6 test al, al
.text:00A3BBE8 mov ecx, [esp+ansiiDest]
.text:00A3BBEC jz short loc_A3BC0F
.text:00A3BBF3 loc_A3BBF3:
.text:00A3BBF3 cmp esi, 1
.text:00A3BBF6 jle short loc_A3BC0E
.text:00A3BBFC add edx, 2
.text:00A3BBFF mov [ecx], al
.text:00A3BC02 mov al, [edx];!!!! ВОТ ОНО ЗЛО!!!!
.text:00A3BC04 add ecx, 1
.text:00A3BC07 sub esi, 1
.text:00A3BC0A test al, al
.text:00A3BC0C jnz short loc_A3BBF3


Что делает этот код? Просто берет первый байт Unicode строки и сохраняет его, абсолютно наплевав на особенности кодировок. И если для английского кода 0065 — буква «S», на выходе получается та же «S» 65, то для русской буквы «н»0414
останется только 14 что является служебным кодом и не может быть использовано в именах файла.
Дальше такая испорченная строка идет по рукам и понятное дело когда приходит время сохранить файл, он не может быть создан по причине неправильных символов в имени пути.
Это только один из случаев. Примеров неправильного использования Unicode великое множество.

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

Пользователям же посоветую, если не хотите проблем с играми — создавайте профили Windows без использования русских букв, а папку «Мои Документы» перенаправьте в другую, англоязычную.
Tags:
Hubs:
Total votes 23: ↑18 and ↓5+13
Comments14

Articles