D
Dann ist das wahrscheinlich irgendwo ein Bug in der streams-Implementierung von Windows, würde ich mal ganz naiv sagen. Zumindest, ohne da jetzt Hintergrundwissen zu besitzen.
Vielleicht kennt jemand ja bereits das Problem - mal "windows wcout abort" gegoogelt? Da komme ich auf solche Threads, vielleicht hilft das ja schon.
Ansonsten ... der String ist nicht schreibgeschützt, sprich, du könntest den String vorher nach Unicode-Zeichen, die Windows nicht darstellen kann, durchsuchen und ersetzen. Den langen Bindestrich durch 'nen ASCII-Bindestrich ersetzen. Ja, ist 'ne blöde Lösung, weiß ich selbst, aber besser als nix.
EDIT:
Habe gerade eben wieder Zugriff auf 'ne Windows-Machine gehabt. So, dieses Programm gibt den Bindestrich korrekt aus:
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main(void)
{
wchar_t cc = 0x2013;
_setmode(_fileno(stdout),_O_U16TEXT);
std::wcout << cc << std::endl;
std::cin.get();
return 0;
}
Sieht also echt so aus, als müsste man die Standardausgabe noch mal Extra auf UTF-16 setzen, damit es funktioniert. Wahrscheinlich der Abwärtskompatibilität wegen ...
EDIT 2: Und für C reicht dann:
_setmode(_fileno(stdout),_O_U16TEXT);
wprintf(L"%lc\n",cc);
Ohne _setmode bricht wprintf allerdings nichts ab, sondern gibt nur ein '?' aus. Ich könnt' jetzt gegen C++ stänkern ...
Egal. Propier' _setmode aus. Bei mir funzt es.