Note : this page often uses "Unix" for non-Windows systems, because Mac OS and Linux are both Unix-based systems. And the Web standard also originated on Unix systems, so for example, it's path separator is the same "/".
The Windows Powershell (v. 2 in Win7) has a function `GetInvalidFileNameChars()` :
[System.IO.Path]::GetInvalidFileNameChars() | ForEach-Object {$i=[int]$_; '{0,3} {1:X2} {2}' -f $i,$i,$_ } | Sort-Object 0 00 1 01 ☺ 2 02 ☻ 3 03 ♥ 4 04 ♦ 5 05 ♣ 6 06 ♠ 7 07 8 08 9 09 10 0A 11 0B ♂ 12 0C ♀ 13 0D 14 0E ♫ 15 0F ☼ 16 10 ► 17 11 ◄ 18 12 ↕ 19 13 ‼ 20 14 ¶ 21 15 § 22 16 ▬ 23 17 ↨ 24 18 ↑ 25 19 ↓ 26 1A → 27 1B ← 28 1C ∟ 29 1D ↔ 30 1E ▲ 31 1F ▼ 34 22 " 42 2A * 47 2F / 58 3A : 60 3C < 62 3E > 63 3F ? 92 5C \ 124 7C |
So it lists the obvious control characters 0 to 31 (x00-x1F), plus
Mac OS in the eighties and nineties (up to version 9) was not a Unix-based system, and used ":" as a path separator. "/" had no special meaning for Macs, so it was accepted in file names like "report 25/3/1992".
When Mac replaced it's OS with Unix, "/" became an invalid character in file names, but on the other hand, ":" was now a perfectly normal character. So it decided to silently replace all "/" with ":", and made it's graphical interface handle the translation invisibly. So you can still see this "report 25/3/1992" file in the Finder, and you can have the impression that you can still write a file named "report 25/12/2019". However, the real file name in the file system will be "report 25:3:1992", and some Mac programs will only see the real file name and not "translate" it on the fly.