STDOUT umleiten

  • Hallo,

    ich versuche die STOUT eines Konsolen-Programmes, im Beispiel ping umzuleiten. Funktioniert auch, jedoch werden die Umlaute nicht korrekt dargestellt, bzw weggelassen. Jemand eine Idee warum?

    Ich erhalte als Ausgabe (hier fehlen die ü's):

    Besten Dank für Eure Hilfe

    Einmal editiert, zuletzt von bronskie (16. Juli 2013 um 22:22)

  • Ja, die Konsole verwendet eine andere Zeichentabelle

    z.B. hat das Zeichen "ü" den Zahlenwert 129 in der Konsole.
    Jedoch nicht in der ASCII Tabelle. Das Zeichen wird auch so nicht in dem Output Fenster der SciTE angezeigt.

    Kleiner Test: ConsoleWrite(Chr(129) & @CRLF)

    Am besten liest du die Daten als Binärdaten ein und veränderst die entsprechenden Bytes der Umlaute.

    LG. Make :)

  • Versuch mal das hier:

    [autoit]

    #include <Constants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $cmd = Run("ping google.de", @ScriptDir,@SW_HIDE,$STDOUT_CHILD)

    [/autoit][autoit][/autoit][autoit]

    Local $a ;
    Local $line=""
    While 1

    [/autoit][autoit][/autoit][autoit]

    $line =StdoutRead($cmd)
    If @error Then
    ConsoleWriteError($line)
    ExitLoop

    [/autoit][autoit][/autoit][autoit]

    EndIf
    ConsoleWrite(ANSI2OEM($line))

    [/autoit][autoit][/autoit][autoit]

    WEnd

    [/autoit][autoit][/autoit][autoit]

    Sleep(2000)

    [/autoit][autoit][/autoit][autoit]

    Func ANSI2OEM($text)
    $text = DllCall('user32.dll','Int','CharToOem','str',$text,'str','')
    Return $text[2]
    EndFunc

    [/autoit]

    Quelle: Parameterübergabe mit Umlauten und Sonderzeichen

    Ich kanns leider auf die Schnelle nicht testen, weil ich ein englisches Windows habe...

    *edit*
    Sorry, falsche Richtung. Siehe nächsten Beitrag von name22...


    Sanfte Grüße :D

  • Friesel Kann es sein, dass du das falschrum konvertierst? Ich war der Meinung, die Zeichen von StdoutRead wären OEM und nicht ANSI...
    So funktioniert es zumindest:

    Beispiel
    [autoit]

    $iPID = Run(@ComSpec & " /c ping 127.0.0.1", @ScriptDir, @SW_HIDE, 0x2)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $sOUT = StdoutRead($iPID)
    If @error Then ExitLoop
    If @extended Then
    $sANSI = _OemToChar($sOUT)
    ConsoleWrite($sANSI)
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _OemToChar($sOEM_Str)
    $aRet = DllCall("user32.dll", "bool", "OemToChar", "str", $sOEM_Str, "str", "")

    [/autoit] [autoit][/autoit] [autoit]

    If Not @error Then Return $aRet[2]
    Return 0
    EndFunc

    [/autoit]

    Edit: Friesel Dein Beispiel stellt bei mir alle "ü" als "_" dar.

  • danke für die schnellen konstruktiven Antworten,

    Am besten liest du die Daten als Binärdaten ein und veränderst die entsprechenden Bytes der Umlaute.

    du meinst also byte für byte vergleichen und gegebenenfalls konvertieren? das muss doch einfacher gehn

    Versuch mal das hier:

    geht leider auch nicht...