I wrote this years ago, if it’s of any help:
Protected Function getCompatibleFileName(myFileName As String, myTargetOS As String = "", replacementText As String = "-") As String
'forum.xojo.com/33582-the-max-dll-issue-on-windows/25#p274969
If myFileName = "" Then Return ""
If myTargetOS = "" Then 'no target, so set to current OS!
#If TargetMacOS Then
myTargetOS = "MacOS"
#ElseIf TargetWindows Then
myTargetOS = "Windows"
#ElseIf TargetLinux Then
myTargetOS = "Linux"
#ElseIf TargetiOS Then
myTargetOS = "iOS"
#EndIf
End If
Select Case myTargetOS
Case "Windows", "Win"
'\/:*?"<>|
myFileName = myFileName.ReplaceAll("\", replacementText)
myFileName = myFileName.ReplaceAll("/", replacementText)
myFileName = myFileName.ReplaceAll(":", replacementText)
myFileName = myFileName.ReplaceAll("*", replacementText)
myFileName = myFileName.ReplaceAll("?", replacementText)
myFileName = myFileName.ReplaceAll("""", replacementText)
myFileName = myFileName.ReplaceAll("<", replacementText)
myFileName = myFileName.ReplaceAll(">", replacementText)
myFileName = myFileName.ReplaceAll("|", replacementText)
Case "MacOS", "Mac", "Macintosh", "iOS"
myFileName = myFileName.ReplaceAll(":", replacementText)
Case "Linux"
myFileName = myFileName.ReplaceAll("\", replacementText)
myFileName = myFileName.ReplaceAll(":", replacementText)
myFileName = myFileName.ReplaceAll("|", replacementText)
Case "ServerFileName"
myFileName = myFileName.ReplaceAll("\", replacementText)
myFileName = myFileName.ReplaceAll("/", replacementText)
myFileName = myFileName.ReplaceAll(":", replacementText)
myFileName = myFileName.ReplaceAll("*", replacementText)
myFileName = myFileName.ReplaceAll("?", replacementText)
myFileName = myFileName.ReplaceAll("""", replacementText)
myFileName = myFileName.ReplaceAll("<", replacementText)
myFileName = myFileName.ReplaceAll(">", replacementText)
myFileName = myFileName.ReplaceAll("|", replacementText)
'problems within quoted filename
myFileName = myFileName.ReplaceAll("$", replacementText)
myFileName = myFileName.ReplaceAll("`", replacementText)
Case "URL"
'myFileName = ReplaceAll(myFileName, " ", "%20")
myFileName = EncodingToURLMBS(myFileName)
Case "URLFileName"
myFileName = myFileName.ReplaceAll("\", replacementText)
myFileName = myFileName.ReplaceAll("/", replacementText)
myFileName = myFileName.ReplaceAll(":", replacementText)
myFileName = myFileName.ReplaceAll("*", replacementText)
myFileName = myFileName.ReplaceAll("?", replacementText)
myFileName = myFileName.ReplaceAll("""", replacementText)
myFileName = myFileName.ReplaceAll("<", replacementText)
myFileName = myFileName.ReplaceAll(">", replacementText)
myFileName = myFileName.ReplaceAll("|", replacementText)
'problems within quoted filename
myFileName = myFileName.ReplaceAll("$", replacementText)
myFileName = myFileName.ReplaceAll("`", replacementText)
'myFileName = ReplaceAll(myFileName, " ", "%20")
myFileName = EncodingToURLMBS(myFileName)
End Select
'#if TargetMacOS then
'myFileName = ReplaceAll(myFileName, ":", replacementText)
'#elseif TargetWindows then
''\/:*?"<>|
'myFileName = ReplaceAll(myFileName, "\", replacementText)
'myFileName = ReplaceAll(myFileName, "/", replacementText)
'myFileName = ReplaceAll(myFileName, ":", replacementText)
'
'myFileName = ReplaceAll(myFileName, "*", replacementText)
'myFileName = ReplaceAll(myFileName, "?", replacementText)
'myFileName = ReplaceAll(myFileName, """", replacementText)
'myFileName = ReplaceAll(myFileName, "<", replacementText)
'myFileName = ReplaceAll(myFileName, ">", replacementText)
'myFileName = ReplaceAll(myFileName, "|", replacementText)
'
'#elseif TargetLinux then
'myFileName = ReplaceAll(myFileName, "\", replacementText)
'myFileName = ReplaceAll(myFileName, ":", replacementText)
'#endif
While myFileName.Left(1) = "." 'Don't want file to become invisible!
myFileName = myFileName.Middle(1)
Wend
Return myFileName
End Function