local filename_chars = { ['"'] = "'", ["\\"] = "_", ["/"] = "_", [":"] = "-", ["*"] = "+", ["?"] = "_", ["<"] = "(", [">"] = ")", ["|"] = "-", } local escape_symbols = { ["%%"] = "%%%%", ["%("] = "%%(", ["%)"] = "%%)", ["%]"] = "%%]", ["%["] = "%%[", ["%-"] = "%%-", ["%+"] = "%%+", ["%*"] = "%%*", ["%?"] = "%%?", ["%$"] = "%%$", ["%."] = "%%.", ["%^"] = "%%^", } local filter = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ()_+-'" local filename_strings = { ["A"] = { "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ā", "Ă", "Ą", "Ǟ", "ǟ", "Ǡ", "ǡ", "Ǣ", "ǣ", "ǻ", "Ǽ", "ǽ", "Ȁ", "ȁ", "Ȃ", "ȃ" }, ["a"] = { "à", "á", "â", "ã", "ä", "å", "æ", "ā", "ă", "ą", }, ["C"] = { "Ç" }, ["c"] = { "ç", }, ["D"] = { "Ď", "Đ", "Ð", }, ["d"] = { "ď", "đ", "ð" }, ["E"] = { "È", "É", "Ê", "Ë", "Ĕ", "Ė", "Ę", "Ě", }, ["e"] = { "ė", "ę", "ĕ", "ě", "è", "é", "ê", "ë" }, ["G"] = { "Ĝ", "Ġ", "Ğ", "Ģ", }, ["g"] = { "ğ", "ĝ", "ġ", "ģ" }, ["H"] = { "Ĥ", "Ħ", }, ["h"] = { "ĥ", "ħ" }, ["I"] = { "Ì", "Í", "Î", "Ï", "Į", "Ĭ", "Ī", "Ĩ", "IJ", "İ", }, ["i"] = { "ı", "ij", "ĩ", "ī", "ĭ", "į", "ì", "í", "î", "ï", }, ["J"] = { "ĵ", "ĵ", "ĵ" }, ["K"] = { "Ķ", }, ["k"] = { "ķ", "ĸ" }, ["L"] = { "Ł", "Ŀ", "Ľ", "Ĺ", "Ļ", }, ["l"] = { "ļ", "ĺ", "ľ", "ŀ", "ł" }, ["N"] = { "Ņ", "Ń", "Ň", "Ŋ", "Ñ", }, ["n"] = { "ñ", "ŋ", "ň", "ń", "ņ", "ʼn", }, ["O"] = { "Ò", "Ó", "Ô", "Õ", "Õ", "Ö", "Ø", "Ō", "Ŏ", "Ŏ", "Ő", "Œ", }, ["o"] = { "ò", "ó", "ô", "õ", "ö", "ø", "ō", "ő", "œ" }, ["R"] = { "Ŕ", "Ŗ", "Ř", }, ["r"] = { "ř", "ŗ", "ŕ", }, ["S"] = { "Ś", "Ŝ", "Ş", "Š", }, ["s"] = { "ß", "ś", "ŝ", "ŝ", "ş", "š" }, ["T"] = { "Þ", "Ţ", "Ť", "Ŧ", }, ["t"] = { "þ", "ţ", "ť", "ŧ", }, ["U"] = { "Ũ", "Ū", "Ŭ", "Ů", "Ų", "Ű", "Ù", "Ú", "Û", "Ü", }, ["u"] = { "ù", "ú", "û", "ü", "ű", "ų", "ů", "ŭ", "ū", "ũ", }, ["W"] = { "Ŵ", }, ["w"] = { "ŵ" }, ["Y"] = { "Ý", "Ŷ", "Ÿ", }, ["y"] = { "ý", "ÿ", "ŷ" }, ["Z"] = { "Ź", "Ż", "Ž", }, ["z"] = { "ż", "ź", "ž" }, ["'"] = { "“", "”" }, } function CanonizeSaveGameName(name) if not name then return end name = name:gsub("(.)", filename_chars) for k,v in pairs(filename_strings) do if type(v) == "string" then name = name:gsub(v, k) elseif type(v) == "table" then for i=1,#v do name = name:gsub(v[i], k) end end end return name end function EscapePatternMatchingMagicSymbols(name) for k,v in sorted_pairs(escape_symbols) do name = name:gsub(k, v) end return name end