Hallo Andreas,
Post by Andreas HeyerPost by Jochen KalmbachIch hab ja auch nicht gesagt, das sie nicht mit wchar_t
zurechtkommt....
???
Womit stellt man denn UNICODE dar? Das ist doch absoluter Schwachsinn,
wenn die Konsole auch mit wchar_t nur die ersten 255 ANSI-Zeichen kann.
Ich hab auch nicht gesagt, dass die Console nur die ersten 255 Zeichen
darstellen kann!
Die Console kann (min.) alle Latin-Zeichen darstellen.
Aber z.B. Chinesische Zeichen per Default eben nicht! Dazu benötigt man
dann eine andere Schriftart (Lucida Console) und man muss natürlich die
chinesische Fonts auf senem Rechner installiert haben!
Post by Andreas HeyerSollen sie halt einen UNICODE-Font nehmen. Manchmal versteht man MS
wirklich nicht...
Warum per default nicht schon der "korrekte" Font verwendet wird ist mir
allerdings auch rätselhaft...
Post by Andreas HeyerPost by Jochen KalmbachHast Du schon mal versucht Zeichen > 127 auszugeben?
(meine Behauptung bezieht sich im übrigen auf wprintf; vermutlich trifft es
aber auch auf wcout zu).
Stell doch mal die Schriftart auf "Lucida Console" um und -schwups-- wird
bei der Ausgabe das Eur-Zeichen dargestellt...
Lucida ändert nichts! Gibt nichts über Code 255! Absoluter Mumpitz.
Äh... das ganze ist ja auch ein Bug in der CRT...
Post by Andreas HeyerWenn die erste Zeile nicht auskommentiert wird, kommt man gar nicht bis
zur Schleife. Und die Schleife bricht nach 255 ab.
Wie gesagt... entweder drücke ich mich undeutlich aus, oder ...
***Es ist ein Bug in der CRT***
Also hier nochmals ein Beispiel:
<code>
#include <windows.h>
#include <stdio.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
// Should output: "AaCcDdEe" (with macron, actute, caron, macron)
wchar_t c[] = {0x0100, 0x0101, 0x0106, 0x0107, 0x010E, 0x010F, 0x0112,
0x0113, '\n', 0x0000};
wprintf(L"wprintf: %s", c); // => BUG (stops after "wrpintf: " !)
std::wcout << L"wcout: " << c; // => BUG (stops after "wcout: " !)
DWORD written; // => The following works correctly:
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), c, sizeof(c)/sizeof
(wchar_t), &written, NULL);
return 0;
}
</code>
Hier werden 3 verschiedene Arten der Ausgaben gemacht:
1. wprintf => BUG: gibt nichts aus
2. wcout => BUG: gibt nichts aus
3. WriteConsoleW => Ok
Wenn Du jetzt hier die "normale" Console verwendest, dann siehst Du bei der
dritten Ausgabe nur "AaCcDdEe"!
Dies ist aber _nicht_ korrekt!
Stelle bitte den Font der Console *bevor* du das Programm startest auf
"Lucida Console" um und (_staun_) wirst Du feststellen, dass die korrekten
Zeichen dargestellt werden (nämlich die obigen nur mit "Akzenten" (oder wie
heissen die komischen Striche?).
Fazit:
In der CRT sind schon immer diese Bugs drin, aber es scheint so als ob sich
niemand dafür interessiert. Vermutlich werden diese Bugs auch noch in
VS2005 drin sein.
Windows sollte zukünftig in der Standard-Consolen-Schriftart alle Zeichen
drin haben..
--
Greetings
Jochen
My blog about Win32 and .NET
http://blog.kalmbachnet.de/