Verschiedene
Kodierungen unterscheiden sich in der Art und Weise, wie die numerischen Werte der zu speichernden Zeichen abgelegt werden, dadurch welche Wertebereiche zur Verfügung stehen und welches Zeichen durch welchen numerischen Wert dargestellt wird.
Unicode spezifiziert, welche numerischen Werte für welche Zeichen stehen, wobei die genaue Speicherung immernoch abhängig von der jeweiligen
Kodierung ist. (UTF-8 verwendet bspw. für ASCII-Zeichen nur 1 Byte im Gegensatz zu bspw. UTF-16) Da Unicode-Kodierungen eine variable Byte-länge besitzen, lassen sich damit alle von Unicode spezifizierten Zeichen speichern, sodass für verschiedene Schriftzeichen (lateinisch, kyrillisch, chinesisch, ...) die gleiche Kodierung verwendet werden kann.
Ältere Kodierungen hatten aber keine standardisierte Zuordnung zwischen numerischem Wert und Zeichen. Die meisten Kodierungen sind zwar ASCII-kompatibel, besaßen aber dennoch ihre eigenen, zusätzlichen Zeichen, auf exotischereren Systemen gab es aber durchaus auch andere Kodierungen oder es wurden einfach mal andere Zeichentabellen verwendet, wodurch (als Beispiel) die 33 nicht auf ein Ausrufezeichen, sondern ein Bodentile verwies.
Alte Software kann dies entweder, weil ihr das bereits explizit beigebracht wurde, oder weil das System für entsprechende Operationen verwendet wird, welches dann entsprechende Kodierungen kennen muss. Die Software muss dafür lediglich eine variable bzw. ausreichend große Breite für das Speichern einzelner Zeichen vorsehen.
Es könnte aber auch sein, dass die Software nicht Zeichen-, sondern Byte-weise funktioniert und die verwendeten (System-)Bibliotheken dann auf die richtige Kodierung schließen können.
Allerdings kann ich nur Vermutungen aufstellen... =/