Codierungs-Problem im Ausgabefenster

Bactunius

Grünschnabel
Ich habe ein C++-Projekt, welches ich nicht direkt mit Visual Studio 2010 baue. Als Konfigurationstyp habe ich "Makefile" ausgewählt und unter NMake, "Buildbefehlszeile" rufe ich eine bat-Datei auf, die dann das eigentliche Bauen vornimmt. Die Ausgabe landet im Ausgabe-Fenster von Visual Studio und genau in diesem habe ich das Problem.
Rufe ich die Datei in der Konsole (z.b. "Visual Studio-Eingabeaufforderung") auf, ist die Ausgabe noch normal. "chcp" sagt 850 als Codepage. In Visual Studio wird hingegen scheinbar alles, was über 7Bit-ASCII ist, verändert. Zumindest wird z.B. ein » (0xAF) zu ??. Die erstellte log-Datei ist UTF-8, indem diese Zeichen ?? dann entsprechend als 0xE2 94 AC 0xE2 95 97 vorkommen.

Meine Frage wäre nun, wie ich das Visual Studio Ausgabe-Fenster dazu bekomme, die Ausgaben korrekt wieder zu geben.
Ich habe bereits im Internet gesucht, aber entweder finde ich nur wie man Erweiterungen für Visual Studio erstellt und dabei etwas in das Ausgabe-Fenster schreibt oder Dinge die noch weniger mit meinem Problem zu tun haben.

Vielen Dank im Voraus,
Bactunius

PS: Ich war mir nicht sicher, ob ich das hier nach "Programmierung, C/C++, VS &MFC" packen sollte, oder ob es vllt. eher nach "Computer & Devices, Microsoft Windows" gehört.
 
Hallo Bactunius,

auf welche Weise erfolgt denn die Ausgabe? Ich hab das grad mal selber ausprobiert und als Buildskript folgende Batch-Datei verwendet:
Code:
@echo off
chcp
echo »
Im Editor in der Codepage 850 gespeichert ergibt das sowohl in der Konsole als auch in Visual Studio die Ausgabe
Code:
Aktive Codepage: 850.
»
Auch im Buildlog, das in UTF-8 kodiert ist, wird das Zeichen richtig angezeigt.

Kannst du vielleicht ein Minimalbeispiel erstellen, bei dem die Ausgabe bei dir nicht klappt?

Grüße,
Matthias
 

Bactunius

Grünschnabel
Hallo,

danke für die Antwort.

Ich habe mal ein Minimalbeispiel erstellt. Die Bat-Datei entspricht dabei deiner Angabe. Bei der Ausgabe in Visual Studio erscheint dann bei mir:
Code:
[...]
1>Build:
1>  Aktive Codepage: 850.
1>  ?
1>
1>Das Erstellen war erfolgreich.
[...]
Als ich die Bat-Datei im Hex-Editor angesehen habe, viel mir auf, dass das Zeichen » nicht 0xAF, sondern 0xBB ist. Von Hand auf 0xAF geändert erscheint die Ausgabe auch in Visual Studio korrekt.
Nun habe ich die Ausgabe der Konsole in eine Datei umgeleitet und » ist dort 0xC2 0xBB, also die UTF-8-Variante. Warum es bei Codepage 850 aber korrekt ausgegeben wird, weiß ich nicht so ganz. Es erklärt aber warum es bei Visual Studio so komisch aussieht, er wandelt die UTF-8-Ausgabe von 850 in UTF-8 um.
Falls das Beispiel dennoch gewollt sein sollte habe ich es mal angehangen.

Nun stellt sich mir allerdings die Frage, wie ich Visual Studio dazu bekommen anzunehmen, dass die Rückgabe UTF-8 ist. Ich habe es schon einmal mit "chcp 65001" am Anfang der Batch-Datei versucht, doch das hat ihn nicht interessiert, obwohl chcp dann immer 65001 als aktive Codepage ausgegeben hat.
Anmerkung: Wenn ich übrigens "chcp 65001" in der Eingabeaufforderung verwende, funktioniert mein Bauen danach nicht mehr richtig.

Gibt es also eine Möglichkeit, dass Visual Studio einfach nur die Rückgabe als UTF-8 Interpretiert und nicht erst konvertiert?

Vielen Dank im Voraus,
Bactunius
 

Anhänge

  • Minimum.zip
    1,9 KB · Aufrufe: 13

deepthroat

Erfahrenes Mitglied
Hi.
Als ich die Bat-Datei im Hex-Editor angesehen habe, viel mir auf, dass das Zeichen » nicht 0xAF, sondern 0xBB ist. Von Hand auf 0xAF geändert erscheint die Ausgabe auch in Visual Studio korrekt.
Das liegt einfach daran, weil du die Datei im Windows CP-1252 ANSI Zeichensatz gespeichert hast. Du solltest aber eigentlich OEM CP-850 verwenden (so wie es in deiner Konsole eingestellt ist).
Nun habe ich die Ausgabe der Konsole in eine Datei umgeleitet und » ist dort 0xC2 0xBB, also die UTF-8-Variante.
Wie hast du das umgeleitet?
Anmerkung: Wenn ich übrigens "chcp 65001" in der Eingabeaufforderung verwende, funktioniert mein Bauen danach nicht mehr richtig.
Ja, leider funktionieren Batch Skripte mit UTF-8 nicht korrekt.

Gruß
 

Bactunius

Grünschnabel
Hallo,

deepthroat hat gesagt.:
Wie hast du das umgeleitet?
Das, was die Batch-Datei macht, habe ich "von Hand" in der Eingabeaufforderung gemacht. Wenn dann die wichtigen Programme aufgerufen werden, habe ich mittels
Code:
Aufruf > ausgabe.txt
die Ausgabe in eine Datei umgeleitet, welche ich mir dann mit Visual Studio Hex-Editor angesehen habe.
Wenn ich nichts umleite sieht für mich die Ausgabe in der Eingabeaufforderung von der Batch-Datei und der von Hand gleich aus.

deepthroat hat gesagt.:
Ja, leider funktionieren Batch Skripte mit UTF-8 nicht korrekt.
Ich hatte es sowohl mit der Batch-Datei, als auch von Hand versucht. In beiden Fällen gibt das entscheidende Programm ein "Schreibfehler" aus, wa ich für eine ungünstige Übersetzung ins Deutsche halte.

Vielen Dank im Voraus,
Bactunius
 

deepthroat

Erfahrenes Mitglied
Hi.

Wo ist denn jetzt noch das Problem? Hast du die Batch Datei nun im Zeichensatz CP 850 gespeichert?
Das, was die Batch-Datei macht, habe ich "von Hand" in der Eingabeaufforderung gemacht.
Was hast du gemacht? Deine Beschreibung ist so nutzlos.

Wenn ich bei mir
Code:
chcp >test.txt
echo » >>test.txt
manuell ausführe, steht in test.txt:
Code:
Active code page: 850
»
wobei "»" == 0xAF entspricht.
Ich hatte es sowohl mit der Batch-Datei, als auch von Hand versucht. In beiden Fällen gibt das entscheidende Programm ein "Schreibfehler" aus, wa ich für eine ungünstige Übersetzung ins Deutsche halte.
Was genau hast du ausgeführt, was wird für ein Programm aufgerufen, wie lautet die Fehlermeldung?

Gruß
 

Bactunius

Grünschnabel
Hallo,

danke für die Antwort.

Wo ist denn jetzt noch das Problem?
Ich baue mein Projekt nicht mit Visual Studio. Stattdessen habe ich eine Batch-Datei. Visual Studio habe ich so konfiguriert, dass es vom Konfigurationstyp "Makefile" ist und bei NMake wird die Batch-Datei aufgerufen. Diese Batch-Datei setzt dann die Entwicklungsumgebung auf und wirft das Bauen des Projektes an, indem er GNU Make aufruft.
Das ganze funktioniert auch ganz schön, nur die Ausgaben von GNU Make im Ausgabe-Fenster von Visual Studio wird falsch angezeigt. In der Eingabeaufforderung (z.B. mit CP850) sieht die Ausgabe jedoch korrekt aus.

Hast du die Batch Datei nun im Zeichensatz CP 850 gespeichert?
In meinem letzten Beitrag hatte ich mich wieder auf die Original-Batch-Dateien, also die, die wirklich die Dateien erstellen, bezogen. Das habe ich allerdings vergessen zu erwähnen, Verzeihung.

Was hast du gemacht? Deine Beschreibung ist so nutzlos.
Anstatt die Erstellungs-Batch-Datei in der Eingabeaufforderung auszuführen habe ich den Inhalt entsprechend von Hand aufgerufen und beim Aufruf von GNU Make die Ausgabe dann in eine Datei umgeleitet (z.B. mittels "make > ausgabe.txt").
Wenn es z.B. nichts bei make zu tun gibt, steht dann in der Datei, mit Hex-Editor betrachtet
Code:
00000000   6D 61 6B 65 3A 20 46 C3  BC 72 20 64 61 73 20 5A   make: Für das Z
00000010   69 65 6C 20 C2 BB 61 6C  6C C2 AB 20 69 73 74 20   iel »all« ist 
00000020   6E 69 63 68 74 73 20 7A  75 20 74 75 6E 2E 0A      nichts zu tun.
Falls ich es nicht in eine Datei umleite, sondern direkt in der Konsole ausgebe (während chcp ein "850" ausgibt), dann sehe ich es dort korrekt:
Code:
make: Für das Ziel »all« ist nichts zu tun.
Die Anzeige in Visual Studio gibt jedoch
Code:
make: F??r das Ziel ??all?½ ist nichts zu tun.
aus.
Öffne ich die Build-Log-Datei mit dem Hex-Editor an sieht entsprechender Abschnitt wie folgt aus:
Code:
00000140                                           6D 61 6B                mak
00000150   65 3A 20 46 E2 94 9C E2  95 9D 72 20 64 61 73 20   e: F├╠r das 
00000160   5A 69 65 6C 20 E2 94 AC  E2 95 97 61 6C 6C E2 94   Ziel ┬╗allâ”
00000170   AC C2 BD 20 69 73 74 20  6E 69 63 68 74 73 20 7A   ¬Â½ ist nichts z
00000180   75 20 74 75 6E 2E                                  u tun.
Ich hoffe, alle Varianten kommen im Browser raus. ;)

Sollte das Problem nur bei "nichts zu tun" auftreten, wäre es nicht so schlimm. Jedoch tritt das Problem auch auf, wenn Fehler im Code sind, die Fehlermeldungen sind dann ziemlich unleserlich.

Was genau hast du ausgeführt, was wird für ein Programm aufgerufen, wie lautet die Fehlermeldung?
Wie oben, habe ich die Erstellung-Batch-Datei per Hand eingegeben. Nachdem ich die Umgebung aufgesetzt habe, habe ich z.B. folgendes gemacht:
Code:
P:\code>chcp
Aktive Codepage: 850.

P:\code>make
make: Für das Ziel »all« ist nichts zu tun.

P:\code>chcp 65001
Aktive Codepage: 65001.

P:\code>chcp
Aktive Codepage: 65001.

P:\code>make
make: Schreibfehler

P:\code>chcp
Aktive Codepage: 65001.

P:\code>chcp 850
Aktive Codepage: 850.

P:\code>make
make: Für das Ziel »all« ist nichts zu tun.

P:\code>

Habe ich es diesmal geschafft das Problem verständlich auszudrücken? Sind die Informationen ausreichend? Ich habe versucht, diesmal jegliche Interpretation meinerseits weg zu lassen.
Gibt es Lösungsideen?

Vielen Dank im Voraus,
Bactunius
 

deepthroat

Erfahrenes Mitglied
Ich baue mein Projekt nicht mit Visual Studio. Stattdessen habe ich eine Batch-Datei. Visual Studio habe ich so konfiguriert, dass es vom Konfigurationstyp "Makefile" ist und bei NMake wird die Batch-Datei aufgerufen. Diese Batch-Datei setzt dann die Entwicklungsumgebung auf und wirft das Bauen des Projektes an, indem
er GNU Make aufruft.
OMG. :eek: Warum? Warum? :confused:

Schau dir mal CMake (oder z.B. premake) an. Damit kann man ordentliche Visual Studio Projekte generieren lassen, und GNU Makefiles und mehr. Make unter Windows ist doch langsam ohne Ende.

Probiere in der Batch Datei mal
Code:
set LANG=C
Gruß
 

Bactunius

Grünschnabel
Hallo,

bei dem Projekt bin ich auf Vorgaben angewiesen und deshalb gezwungen das so zu machen. Ich bin auch nicht glücklich darüber. ;)

Die Angabe führt dazu, dass Visual Studio nun
make: Nothing to be done for `all'.
ausgibt. Auch die Fehler sind leserlich.

Vielen Dank!
Bactunius
 

Neue Beiträge