Meikrosoft des tages

Erstmal ein bisschen C++-kohd… wahrlich nix kompliziertes, einfach nur die formatierte ausgabe einer zahl, bei der die sprach- und landeseinstellungen berücksichtigt werden sollen — es hilft doch sehr, die größenordnung auf dem ersten blick abzuschätzen, wenn man tausenderseparatoren verwendet:

#include <iostream>
#include <locale>

using namespace std;

int main (int argc, char **argv)
{
    locale loc ("");
    cout.imbue (loc);
    cout << 1234567 << endl;
    return 0;
}

Frage: was wird ausgegeben, wenn man das mit meikrosofts „visual studio“ als konsolenanwendung kompiliert und das resultierende binary unter windohs sieben in der CMD.EXE-konsole aufruft?

Mit unbearbeiteten deutschen landeseinstellungen sollte hier 1.234.567 ausgegeben werden (und schweizerdeutsche einstellungen ergäben 1'234'567). Nun, auf einem kompjuter kam 1ÔÇç234ÔÇç567 raus, was natürlich… ähm… ein kleines bisschen unerwartet aussieht und die zahl auch nicht leichter lesbar macht. 😯

Hl. henker! Woran liegt das?

Bei einem blick in die landeseinstellungen in der windohs-systemsteuerung dieses kompjuters habe ich zunächst gedacht, dass dort ein leerzeichen als tausender-separator angegeben wurde. Es war aber kein „normales leerzeichen“ U+0020, sondern ein „ziffernleerzeichen“ U+2007 (also ein &numsp; in HTML oder ein \hphantom{0} in LaTeX). Auch im jahr 2018 kann es einem also immer noch (völlig unerwartete) probleme bereiten, dass diese scheiß-CMD.EXE nicht unicodefähig ist und eine völlig andere zeichenkohdierung als der gesamte rest des systemes verwendet. Das sind diese kleinen momente, in denen ich ganz froh darüber bin, dass ich es nur noch selten mit windohs zu tun habe und deshalb schon ganz vergessen habe, was für heitere altlasten dieses flickwerk mit sich herumträgt…

Dass diese beiden verschiedenen leerzeichen (unicode hat noch einige mehr anzubieten) in so einem einstellungsdialog wegen ihrer leerzeichenhaftigkeit natürlich nicht durch hingucken unterscheidbar sind und dass man sich deswegen etwas länger fragt, woran zum henker es liegt, brauche ich hoffentlich gar nicht erst zu erwähnen. Die moral der heitren kurzgeschicht: für CMD verwende die locales nicht!

5 Antworten zu “Meikrosoft des tages

    • Guter Punkt, aber im gegebenen Beispiel ist std die einzige Bibliothek, also sind hier keine Distinktionshilfen nötig. Und der Mangel an Substruktur im std-Namensraum muss ja nicht immer und überall aufdringlich demonstriert werden.

  1. Ansonsten gefällt es mir, dass Microsoft cmd weitgehend abgelöst hat oder das versucht. Die Powershell – so grausam sie in vielen Dingen auch sein mag – kann sogar POSIX-Farben… 😉

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.