Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

SetConsoleCP funktioniert bei Open Pipe nicht

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 11

BeitragVerfasst am: 24.09.2020, 11:16    Titel: SetConsoleCP funktioniert bei Open Pipe nicht Antworten mit Zitat

Open Pipe reagiert nicht, wenn mit SetConsoleCP eine andere Zeichentabelle gewählt wird.
Kann mir jemand etwas dazu sagen?

Gruß
hhr
Code:
#Include "windows.bi" ' GetACP, GetOEMCP, SetConsoleCP
Print "ANSI Code Page: ";GetACP
Print "OEM Code Page: ";GetOEMCP
Print String(20,196)

Dim As String s,s1
s="ECHO äöüÄÖÜ"

Shell "CHCP"
Open Pipe s For Input As #1
   Line Input #1,s1
   Print s1
Close #1

Print

Shell "CHCP " & Str(GetACP) & " > NUL"
Shell "CHCP"
Open Pipe s For Input As #1
   Line Input #1,s1
   Print s1
Close #1
Shell "CHCP " & Str(GetOEMCP) & " > NUL"
Shell "CHCP"

Print

SetConsoleCP(GetACP)
Shell "CHCP"
Open Pipe s For Input As #1
   Line Input #1,s1
   Print s1
Close #1
SetConsoleCP(GetOEMCP)
Shell "CHCP"

Sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4340
Wohnort: ~/

BeitragVerfasst am: 24.09.2020, 15:09    Titel: Antworten mit Zitat

Ich kann das Problem gerade nicht rekonstruieren. Das Programm verwendet dreimal OPEN PIPE, und ich bekomme dreimal eine Ausgabe.

Code:
ANSI Code Page: 1252
OEM Code Page: 850
────────────────────
Aktive Codepage: 850.
äöüÄÖÜ

Aktive Codepage: 1252.
äöüÄÖÜ
Aktive Codepage: 850.

Aktive Codepage: 1252.
äöüÄÖÜ
Aktive Codepage: 850.


Betriebssystem: Windows 10; Quelltext gespeichert in UTF-8 mit BOM.
(edit: auch mit Zeichenkodierung ISO-8859-15 kommt es zu dieser Ausgabe)

Ob es sich um die gewünschte Ausgabe handelt, kann ich nicht nachvollziehen; dazu reicht mein Wissen nicht. grinsen
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1016
Wohnort: Ruhrpott

BeitragVerfasst am: 24.09.2020, 15:53    Titel: Antworten mit Zitat

Läuft auch unter WinXP wie von nemored beschrieben.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 11

BeitragVerfasst am: 24.09.2020, 17:49    Titel: Antworten mit Zitat

Bei Windows 7 und Windows XP bekomme ich folgende Ausgabe:
Code:
ANSI Code Page: 1252
OEM Code Page: 850
────────────────────
Aktive Codepage: 850.
äöüÄÖÜ

Aktive Codepage: 1252.
õ÷³─Í▄
Aktive Codepage: 850.

Aktive Codepage: 1252.
äöüÄÖÜ
Aktive Codepage: 850.

Die mittlere Ausgabe mit õ÷³─Í▄ ist richtig. Schließlich ist die Tabelle gewechselt worden.
Das Beispiel mit Open Pipe habe ich gewählt, weil ich in einem Programm lange suchen musste,
um den Fehler bei Open Pipe dingfest zu machen. Wenn man die Code Page wechselt,
kann man Pfadangaben vergleichen, die auch Sonderzeichen wie zum Beispiel das Euro-Zeichen enthalten.
Meiner Meinung nach muss auch der untere Abschnitt mit SetConsoleCP õ÷³─Í▄ ausgeben.
Jetzt macht mich stutzig, daß sich auf Euren Rechnern gar nichts ändert. Was für ein Problem ist das denn?
Verweisen muss ich jetzt wohl auf
https://www.freebasic-portal.de/code-beispiele/dateien-laufwerke/dateien-ordner-suchen-323.html
Das Programm dürfte auf Euren Rechnern nicht funktionieren.

Jedenfalls möchte ich mich hier schon einmal bedanken.
hhr


Zuletzt bearbeitet von hhr am 25.09.2020, 20:36, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4340
Wohnort: ~/

BeitragVerfasst am: 24.09.2020, 18:24    Titel: Antworten mit Zitat

Zitat:
Verweisen muss ich jetzt wohl auf
https://www.freebasic-portal.de/code-beispiele/dateien-laufwerke/dateien-ordner-suchen-323.html
Das Programm dürfte auf Euren Rechnern nicht funktionieren.


Tut mir leid, dich enttäuschen zu müssen grinsen
Code:
ANSI Code Page: 1252
OEM Code Page: 850
────────────────────
Zu durchsuchenden Pfad eingeben: C:\
C:\

Gesamter oder Teil des Namens: fbc.exe
fbc.exe
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Datei:
C:\Program Files (x86)\FreeBASIC\fbc.exe

Datei:
C:\Users\nemored\Documents\BASIC\FreeBASIC\fbc.exe

Datei:
C:\Users\nemored\Documents\BASIC\FreeBASIC-1.07.1-win64\fbc.exe

Datei:
C:\Users\nemored\Downloads\FreeBASIC_plus_wxFBE\FreeBASIC\fbc.exe


Ende mit beliebiger Taste...

Funktioniert auch mit Umlauten im Suchnamen.

Ich halte es aber für möglich, dass bei diesem Einsatz die Codepage vollkommen egal ist (sofern sie die in der Eingabe benötigten Zeichen unterstützt).
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1016
Wohnort: Ruhrpott

BeitragVerfasst am: 25.09.2020, 10:09    Titel: Antworten mit Zitat

Der Grund für das seltsame Verhalten ist, daß es zwei Codepages gibt, eine für die Eingabe und eine für die Ausgabe. Mit dem Shellbefehl CHCP... werden immer beide Codepages auf denselben Wert gesetzt, mit SetConsoleCP nur die Eingangspage, was dann in der Folge zu einem "Übersetzungsfehler" führt (siehe jeweils die ASCII - Werte von s1 ):
Code:
#Include "windows.bi" ' GetACP, GetOEMCP, SetConsoleCP
Shell "CHCP"
Print "ANSI Code Page: ";GetACP
Print "OEM Code Page: ";GetOEMCP
Print "Console Input Page: ";GetConsoleOutputCP
Print "Console Output Page: ";GetConsoleCP

Print String(20,196)

Dim As String s,s1
s="ECHO äöüÄÖÜ"

Shell "CHCP"
Print "ConsoleCP:       ";GetConsoleCP
Print "ConsoleOutputCP: ";GetConsoleOutputCP
Open Pipe s For Input As #1
Line Input #1,s1
Print s1;" A"
For x As Integer = 0 To Len(s1) -1
   Print s1[x];" ";
Next
Print
Close #1

Print

Shell "CHCP " & Str(GetACP) & " > NUL"
Shell "CHCP"
Print "ConsoleCP:       ";GetConsoleCP
Print "ConsoleOutputCP: ";GetConsoleOutputCP
Open Pipe s For Input As #1
Line Input #1,s1
Print s1;" B"
For x As Integer = 0 To Len(s1) -1 'ASCII - werte des strings
   Print s1[x];" ";
Next
Print
Close #1

Print

Shell "CHCP " & Str(GetOEMCP) & " > NUL"
Shell "CHCP"
Print "ConsoleCP:       ";GetConsoleCP
Print "ConsoleOutputCP: ";GetConsoleOutputCP
Open Pipe s For Input As #1
Line Input #1,s1
Print s1;" C"
For x As Integer = 0 To Len(s1) -1
   Print s1[x];" ";
Next
Print
Close #1

Print

SetConsoleCP(GetACP)
Shell "CHCP"
Print "ConsoleCP:       ";GetConsoleCP
Print "ConsoleOutputCP: ";GetConsoleOutputCP
Open Pipe s For Input As #1
Line Input #1,s1
Print s1;" D"
For x As Integer = 0 To Len(s1) -1
   Print s1[x];" ";
Next
Print
Close #1

Print

SetConsoleCP(GetOEMCP)
Shell "CHCP"
Print "ConsoleCP:       ";GetConsoleCP
Print "ConsoleOutputCP: ";GetConsoleOutputCP

Sleep


Was die Suchfunktion betrifft, kann ich nemoreds Aussage bestätigen, auch französische Akzente sind kein Problem. Meines Wissens arbeitet Windows seit NT intern mit Unicode.

Übrigens: Zum Umwandeln einzelner Strings gibt es die WinAPI - Funktionen CharToOem und OemToChar.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hhr



Anmeldungsdatum: 15.07.2020
Beiträge: 11

BeitragVerfasst am: 25.09.2020, 20:30    Titel: Antworten mit Zitat

Jetzt fehlt nur noch SetConsoleOutputCP.

Man muss SetConsoleCP und SetConsoleOutputCP nach Bedarf wählen.


Ohne Eure Hilfe würde ich immer noch rätseln.
Dank und Gruß
hhr

Code:
#Include "windows.bi" ' GetACP, GetOEMCP, SetConsoleOutputCP
Print "ANSI Code Page: ";GetACP
Print "OEM Code Page: ";GetOEMCP
Print String(20,196)

Dim As String s,s1
s="ECHO äöüÄÖÜ"

Open Pipe s For Input As #1
   SetConsoleOutputCP(GetACP)
   Line Input #1,s1
   SetConsoleOutputCP(GetOEMCP)
   Print s1,Wstr(s1)
Close #1

Sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz