Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 104
|
Verfasst am: 24.09.2020, 11:16 Titel: SetConsoleCP funktioniert bei Open Pipe nicht |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4648 Wohnort: ~/
|
Verfasst am: 24.09.2020, 15:09 Titel: |
|
|
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. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1235 Wohnort: Ruhrpott
|
Verfasst am: 24.09.2020, 15:53 Titel: |
|
|
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 |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 104
|
Verfasst am: 24.09.2020, 17:49 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4648 Wohnort: ~/
|
Verfasst am: 24.09.2020, 18:24 Titel: |
|
|
Tut mir leid, dich enttäuschen zu müssen
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1235 Wohnort: Ruhrpott
|
Verfasst am: 25.09.2020, 10:09 Titel: |
|
|
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 |
|
|
hhr
Anmeldungsdatum: 15.07.2020 Beiträge: 104
|
Verfasst am: 25.09.2020, 20:30 Titel: |
|
|
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 |
|
|
|