Wenn in dc ungültige oder undefinierte Befehle ausgeführt werden, wird normalerweise nur eine Warnung ausgegeben. Beispiel:
cp
dc: stack empty
Das ist meistens ganz nett, es gibt jedoch Fälle, in denen es nervt, da die gewünschte Aktion eigentlich funktioniert. Betrachten Sie dieses Beispiel:
5 6+sИlИp
dc: 0230 unimplemented
dc: 0230 unimplemented
11
Sehen Sie? Selbst wenn ich versuche, ein anderes Register als die im Handbuch angegebenen zu verwenden, funktioniert es immer noch. („offiziell“ 256, aber wie soll man das NUL-Byte überhaupt verwenden?)
Auch wenn es vielleicht nicht immer eine gute Idee ist, würde ich mir wünschen, dass dc mir in manchen Skripten nun solche Warnungen anzeigt.
Wie kann ich erreichen, dass dc keine Warnungen ausgibt?
Antwort1
Die Fehler sind auf die Multibyte-Zeichen zurückzuführen. GNU (und ich glaube, alle modernen Unix-Systeme) verwenden UTF-8.
daher
dc <<< "5 6+s¢l¥p"
ist gleichbedeutend mit dc <<< "5 6+s¢l¢p"
. Das erste Byte von ¢ und ¥ ist gleich und wird als Adresse des Registers verwendet. Das 2. Byte erzeugt den Fehler.
siehe Ausgabe vonod
#↳ od -ta -to1 <<< "5 6+s¢l¥p"
0000000 5 sp 6 + s B " l B % p nl
065 040 066 053 163 302 242 154 302 245 160 012
Daher ist der Fehler gültig und sollte nicht ignoriert werden.
Probieren Sie diesen Testfall aus. dc <<< "4s¢11s¥l¢p"
Welche Ausgabe erwarten Sie? ( dc
warnt, dass ein Problem vorliegt.) Welche Ausgabe wird erzeugt?
dc
ist nicht UTF-8-fähig, es arbeitet mit Bytes. UTF-8 ist fast, aber nicht ganz kompatibel mit 8-Bit-Kodierungen (ähnlich wie ASCII).
sehen:https://www.youtube.com/watch?v=MijmeoH9LT4(Computerphile zu UTF-8).