Umlaute werden nicht erkannt

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Folllast
Posts: 91
Joined: 24 Jan 2018, 04:57

Umlaute werden nicht erkannt

05 Mar 2019, 05:50

Hallo,

ich habe einen Script, der einen Befehl an die Eingabekonsole sendet und das Ergebnis ausgibt.
Das Problem ist, dass dabei die Umlaute verloren gehen. Wenn ich den befehl direkt in die Eingabeaufforderung eingebe, werden die Umlaute korrekt angezeigt.

Hier der Auszug aus dem Programm, das verantwortlich ist.

Code: Select all

MsgBox % RunWaitEin(string)
RunWaitEin(Befehl) {
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(ComSpec " /C " Befehl)
return exec.StdOut.ReadAll()
}
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Umlaute werden nicht erkannt

05 Mar 2019, 06:08

Welche AHK Version verwendest du? Also Unicode oder Ansi?
Recommends AHK Studio
effel
Posts: 544
Joined: 16 Jan 2018, 13:34

Re: Umlaute werden nicht erkannt

05 Mar 2019, 09:38

hey :-)
ich habe leider keine antwort für dich, nur eine frage

kann man die eingabeaufforderung auch hidden aufrufen?
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Umlaute werden nicht erkannt

05 Mar 2019, 10:30

Versuch mal Unicode 32 bit zu verwenden - dann sollte es klappen.
Recommends AHK Studio
gregster
Posts: 9002
Joined: 30 Sep 2013, 06:48

Re: Umlaute werden nicht erkannt

05 Mar 2019, 11:01

effel wrote:
05 Mar 2019, 09:38
kann man die eingabeaufforderung auch hidden aufrufen?
Es geht

Code: Select all

RunWait, %ComSpec% /c dir c:\ >C:\Users\g\Desktop\dir.txt, , hide	; leitet Ergebis von "dir c:\" in txt-Datei um
mit der hide Option.
effel
Posts: 544
Joined: 16 Jan 2018, 13:34

Re: Umlaute werden nicht erkannt

05 Mar 2019, 11:05

hallo gregster,
danke, war mir bekannt. :-)

ich meinte im code von Folllast
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Umlaute werden nicht erkannt

05 Mar 2019, 12:25

Moin,

die gute alte ComSpec-Console verwendet in der Standardeinstellung einen sogenannten OEM-Zeichensatz. Der hat die deutschen Umlaute auf anderen Zeichenpositionen. Du kannst ihn in den 'Einstellungen' des Consolenfensters finden. Normalerweise ist das die Codepage, die von folgender API-Funktion geliefert wird:

Code: Select all

OEMCP := DllCall("GetOEMCP", "UInt")
Die in OEMCP zurückgegebene Nummer kann z.B. mit der Funktion StrGet() als Option "CP" . OEMCP genutzt werden.
gregster
Posts: 9002
Joined: 30 Sep 2013, 06:48

Re: Umlaute werden nicht erkannt

05 Mar 2019, 12:51

effel wrote:
05 Mar 2019, 11:05
ich meinte im code von Folllast
Sorry, ist leider etwas Offtopic, aber so geht's mit gewissen Abwandlungen (und einem Umweg für die Ausgabe):
Spoiler
effel
Posts: 544
Joined: 16 Jan 2018, 13:34

Re: Umlaute werden nicht erkannt

05 Mar 2019, 13:01

ist garnicht so offtopic, mit der letzten version sind auch die umlaute dargestellt

Ping wird ausgefhrt fr 8.8.8.8 mit 32 Bytes Daten:

Ping wird ausgeführt für 8.8.8.8 mit 32 Bytes Daten:
gregster
Posts: 9002
Joined: 30 Sep 2013, 06:48

Re: Umlaute werden nicht erkannt

05 Mar 2019, 13:08

effel wrote:
05 Mar 2019, 13:01
ist garnicht so offtopic, mit der letzten version sind auch die umlaute dargestellt

Ping wird ausgefhrt fr 8.8.8.8 mit 32 Bytes Daten:

Ping wird ausgeführt für 8.8.8.8 mit 32 Bytes Daten:
Stimmt, ist mir auch gerade aufgefallen (bei mir war es Datenträger vs. Datentr„ger). Wunderbar :D
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Umlaute werden nicht erkannt

06 Mar 2019, 04:40

Moin,

meiner Meinung nach besteht der Sinn der WScript.Shell Methode hauptsächlich darin, das umgebende System möglichst unangetastet zu lassen. Zum umgebenden System zählt für mich auch die Zwischenablage, deshalb hier folgende Alternative, die auch zu funktionieren scheint:

Code: Select all

#NoEnv
MsgBox % RunWaitEin("ping 8.8.8.8")
ExitApp

RunWaitEin(Befehl) {
   Static OEMCP := "CP" . DllCall("GetOEMCP", "UInt")
   shell := ComObjCreate("WScript.Shell")
   exec := shell.Exec(ComSpec " /C " Befehl)
   result := exec.StdOut.ReadAll()
   If (A_IsUnicode) {
      VarSetCapacity(oemstr, StrPut(result, "CP0"), 0)
      StrPut(result, &oemstr, "CP0")
   }
   Return StrGet(A_IsUnicode ? &oemstr : &result, OEMCP)
}
Für die Clipboard-Methode braucht es den Umweg über die WScript.SHell nicht:

Code: Select all

#NoEnv
MsgBox % RunWaitEinClip("ping 8.8.8.8")
ExitApp

RunWaitEinClip(Befehl) {
   SavedClip := ClipboardAll
   RunWait, %ComSpec% /c %Befehl% | Clip, , Hide
   Result := Clipboard
   Clipboard := SavedClip
   Return Result
}
Übrigens: Zum Sichern der kompletten Zwischenablage sollte es OldClip := ClipboardAll sein.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 60 guests