[Scummvm-tracker] [ScummVM :: Bugs] #13276: AGS: Cannot open files with non-ASCII characters in their name

ScummVM :: Bugs trac at scummvm.org
Wed Feb 16 20:29:59 UTC 2022


#13276: AGS: Cannot open files with non-ASCII characters in their name
-------------------+--------------------------
Reporter:  criezy  |       Owner:  (none)
    Type:  defect  |      Status:  new
Priority:  normal  |   Component:  Engine: AGS
 Version:          |  Resolution:
Keywords:          |        Game:
-------------------+--------------------------
Comment (by criezy):

 I now suspect the encoding used is CP 1252, which apparently is what is
 used by Windows for the file name encoding (at least in most Western
 countries), rather than ISO-8859-1.

 I have also verified that the same issue exists with the standalone AGS
 interpreter. But I suspect it might work on Windows, although maybe not on
 Russian or Japanese Windows for example.

 Here is the call stack where the error occurs:
 {{{
   frame #0: AGS3::init_translation(lang, fallback_lang,
 quit_on_error=false) at translation.cpp:61:6
   frame #1: AGS3::Game_ChangeTranslation(newFilename="Fran\xe7ais") at
 game.cpp:725:6
   frame #2: AGS3::Sc_Game_ChangeTranslation(params, param_count=1) at
 game.cpp:1491:2
   frame #3: AGS3::ccInstance::Run(this, curpc=0) at
 cc_instance.cpp:1023:20
   frame #4: AGS3::ccInstance::CallScriptFunction(this,
 funcname="hFrancais_AnyClick", numargs=0, params) at
 cc_instance.cpp:341:15
   frame #5: AGS3::RunScriptFunctionIfExists(sci,
 tsname="hFrancais_AnyClick", numParam=0, params) at script.cpp:363:32
   frame #6: AGS3::RunTextScript(sci, tsname="hFrancais_AnyClick") at
 script.cpp:412:14
   frame #7: AGS3::RunScriptFunction(sc_inst=kScInstRoom,
 fn_name="hFrancais_AnyClick", param_count=0, p1, p2) at script.cpp:269:4
   frame #8: AGS3::post_script_cleanup() at script.cpp:554:3
   frame #9: AGS3::RunScriptFunctionIfExists(sci,
 tsname="hFrancais_AnyClick", numParam=1, params) at script.cpp:380:2
 }}}

 So basically `Game_ChangeTranslation` gets called from a script with the
 filename of the translation to use. I cannot see any encoding conversion,
 so it looks like the script is expected to provide the filename in
 whatever encoding is used by the OS. Since the game was only released for
 Windows (and since that is the main system targeted by AGS), it makes
 sense to assume CP 1252 encoding.

 I also checked that the AGS documentation for `Game_ChangeTranslation` and
 for the `File` class does not mention anything about the encoding.
 https://adventuregamestudio.github.io/ags-
 manual/Game.html#gamechangetranslation
 https://adventuregamestudio.github.io/ags-manual/File.html

 I also suspect that it doesn't work on Windows in ScummVM. If I understand
 properly the following two PRs, the ScummVM FS code now expects filenames
 in UTF-8 on Windows:
 https://github.com/scummvm/scummvm/pull/3003
 https://github.com/scummvm/scummvm/pull/3122

 UTF-8 is also what is used on macOS, and most of the time on Linux I
 think.

 So maybe we should assume CP 1252 in `Game_ChangeTranslation`, assume we
 need UTF-8 in ScummVM, and do the encoding conversion for the file name?
 That would not impact translation set in our GUI as it calls directly
 `init_translation `.
 However are those assumptions correct? Could a Russian game for example
 use a different encoding if it has file names with non ASCII characters?
 We could make an assumption on the encoding based on the game language if
 that is needed. But for translations that would be useless as then it is
 multilingual and we don't specify a game language in the detection.

 And is this something that should be done at a lower level (e.g. in the
 AGS `File` class) so that it is also done when opening other types of
 files the game may be using? However there we would have another issue as
 we have filenames that come from ScummVM (e.g. savegame files, translation
 files when set in the ScummVM GUI) and those would already be in UTF-8.

 I am hoping this is an issue that are restricted to only a few games and
 that most games don't have the strange idea to use non-ASCII characters
 for file names. So maybe we don't need to overthink it.

 A simple fix here would be to do CP-1252 to UTF-8 conversion in
 `Game_ChangeTranslation` (or maybe in `SC_ Game_ChangeTranslation `)? It
 will not break games that only use ASCII characters, and for games that
 have non-ASCII characters in another encoding (if there is any) they would
 not work anyway currently. If in the future we find such a game, the code
 could be updated. And if we see the same issue for other types of files,
 we could add a similar conversion in the corresponding script function.

 Finally, as an aside, the reason it works when selecting the translation
 in the ScummVM GUI is because there the encoding for the file name is
 properly handled (it is consistent). And that sets the translation when
 starting the game. Then when it gets to the language selection screen it
 fails to change the translation when selection French and thus remains on
 the one previously set.
-- 
Ticket URL: <https://bugs.scummvm.org/ticket/13276#comment:2>
ScummVM :: Bugs <https://bugs.scummvm.org>
ScummVM


More information about the Scummvm-tracker mailing list