Zeichenmanipulation Zeilenumbruch

Hier dürfen auch unregistrierte Besucher posten.
Antworten
Daniel

Zeichenmanipulation Zeilenumbruch

Beitrag von Daniel »

Hallo Zusammen,

ich bin nun nach 4 oder 5 Stunden Suche mit meinem Latein am Ende und hoffe, dass Ihr mir weiterhelfen könnt. Von der Theorie her ist es nichts dramatisches.

Ich bekomme aus einem Tool A eine Zeichenkette an ein DOS Skript übergeben. Diese Zeichenkette kann Zeilenumbrüche im Unixformat \r\n enthalten. Ebenso können hier Umlaute oder andere Sonderzeichen vorkommen. Innherhalb des DOS Skriptes rufe ich dann einen Browser inkl. URL auf die u.a. diese Zeichenkette an ein Tool B übergibt.

Die Zeichenkette ist z.B.

dies\r\nist\r\neine\r\nzeichenkette\r\nöäüß

Ich möchte nun, um das ganze URL konform zu bekommen, zum einen den Zeilenumbruch \r\n durch %0D%0A ersetzen und zum Anderen die Umlaute öäü sowie das ß durch die HTML gängigen Zeichen ä ü.... ersetzen.

Das Skript sieht wie folgt aus

@echo OFF
SET DESC=%~3
SET DESC=%DESC:\r\n=%%%0D%%0A%
"programfiles(x86)%\internet explorer\iexplore.exe" "https://meineurl.de?param1=1&param2=2&description=%DESC%"

Ich bekomme es nicht hin das z.B. aus der oben genannten Zeichenkette jedes vorkommende \r\n durch %0D%0A ersetzt wird. Das Ergebnis im oben genannten Fall wäre

diesisteinezeichenketteöäüß%0D%0A

Er trägt also lediglich am Ende einmalig das %0D%0A ein und schmeißt die \r\n Vorkommen weg. Nehme ich etwas Anderes wie z.B.

SET DESC=%DESC:\r\n=0D0A%

dann wird aus der Beispielkette

dies0D0Aist0D0Aeine0D0Azeichenkette0D0Aöäüß

Sobal ich jedoch ein %-Zeichen mit einbauen möchte, siehrt es wie oben aus.
-----------------------------------------------------------------
Problem 2 - Die Umlaute

Bei den Umlauten ist es nun so, dass hier ä offenbar als Befehl interpretiert wird. Zumindest bekomme ich hier die Ausgabe am Prompt "Der Befehl "auml" ist entweder falsch geschrieben oder konnte nicht gefunden werden"

Auch ein Maskieren mit ^ä funktioniert an der Stelle nicht.

Ich hoffe Ihr könnt mir helfen.

Vielen Dank & schöne Grüße

Daniel
Gast

Re: Zeichenmanipulation Zeilenumbruch

Beitrag von Gast »

Hallo Zusammen,

nach längerem probieren habe ich Teil 1, den Zeilenumbruch, nun doch hinbekommen. Dazu habe ich das Script um die Folgenden Zeilen erweitert.

setlocal enabledelayedexpansion
SET crlf=\r\n
SET subs=%%0D%%0A
SET DESC=!DESC:%crlf%=%subs%!

Dadurch werden nun alle vorgommenden \r\n durch %0D%0A ersetzt. Weiterhin hänge ich jedoch bei den html Ersatzzeichen für die Umlaute.

Schöne Grüße

Daniel
Daniel

Re: Zeichenmanipulation Zeilenumbruch

Beitrag von Daniel »

Sooooo.....

nun habe ich auch das letzte Puzzlestück gefunden. Die HTML Ersatzzeichen bekommt man durch

SET "DESC=!DESC:ä=^ä!"

eingebaut. wobei DESC durch die eigene Variable ersetzt wird.

Anbei nun das komplette Script:

@echo OFF
setlocal disabledelayedexpansion
SET DESC=%~3
SET crlf=\r\n
SET subs=%%0D%%0A

setlocal enabledelayedexpansion
SET "DESC=!DESC:^!=^!!"
SET "DESC=!DESC:%crlf%=%subs%!"
SET "DESC=!DESC:ä=^ä!"
SET "DESC=!DESC:ö=^ö!"
SET "DESC=!DESC:ü=^ü!"
SET "DESC=!DESC:Ä=^Ä!"
SET "DESC=!DESC:Ö=^Ö!"
SET "DESC=!DESC:Ü=^Ü!"

setlocal disabledelayedexpansion

"%programfiles(x86)%\internet explorer\iexplore.exe" "https://meineurl/irgendeeine!init.jsp?p ... ram3=%DESC%

Ich habe während meinen Test herausgefunden, dass durch "enabledelayedexpansion" das Ausrufezeichen aus der URL gelöscht wird, was im Ukehrschluss wieder zu einer fehlerhaften URL führt. Da ich jedoch enabledelayedexpansion brauche um alle vorkommenden Zeichen zu ersetzten, muss dieser "modus" abgeschaltet werden, bevor die URL auftaucht.

Dadurch klappt nun alles !!!!

Vielen Dank an alle, die sich einen Kopf gemacht haben!

Schöne Grüße

Daniel
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Zeichenmanipulation Zeilenumbruch

Beitrag von freecrac »

Moin.

Solche Windows-Fragen gehören eigentlich gar nicht in dieses DOS-Forum.

Allerdings hatte ich ein ähnliches Problem mit den unterschiedlichhen Zeilenumbrüchen in Textdateien, wo einmal 0Dh+0Ah und ein anderes Mal nur ein 0Ah benötigt wird. Dafür habe ich zwei kleine DOS-Programme geschrieben, wo das eine Programm alle 0Dh aus einer Textdatei entfernt und das andere Programm jeweils ein 0Dh bei allen dort vorhandenen 0Ahs mit einfügt.

Auf ähnliche Weise könnte man auch bestimmte Zeichen durch andere Zeichen ersetzen lassen, wenn man das Programm dafür entsprechend modifiziert.

Code: Alles auswählen

;╔════════════════════════════════════════════════════════════════════════════╗
;║                                                                            ║
;║     Dieses Programm entfernt alle Carrige Return(0Dh) aus einer Datei,     ║
;║     dessen Name als Parameter, mit übergeben wird.                         ║
;║     Die Datei muß kleiner als 64KB groß sein.                              ║
;║                                                                            ║
;║ #!/bin/sh                                                                  ║
;║ for i in `find -type f`; do tr -d '\r' <$i >/tmp/trtmp && mv /tmp/trtmp    ║
;║                                                                            ║
;║  (C) Copyright:          Freie Cracker Crew Hamburg Horn                   ║
;║            von:                Dirk Wolfgang Glomp                         ║
;║                                                                            ║
;╚════════════════════════════════════════════════════════════════════════════╝
.MODEL SMALL                         ; Programm möglichst klein halten
.386
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
 org 100h
;────────────────────────────────────────────────────────────────────────────
START:    mov      ax, DATEN
          mov      ds, ax

          mov      bx, ss            ; zunächst die beiden Segmentadressen
          mov      ax, es            ; voneinander abziehen. Das ergibt die
          sub      bx, ax            ; Anzahl der Paragraphen vom PSP bis
                                     ; zum Anfang des Stack
          mov      ax, sp            ; da sich der Stackpointer am Ende des
          add      ax, 0Fh           ; Stacksegments befindet, gibt sein
          shr      ax, 4             ; Inhalt die Länge des Stacks an
          add      bx, ax            ; zur bisherigen Länge hinzuaddieren
          mov      ah, 4Ah           ; neue Größe an das DOS übergeben
          int    21h

          mov      bx, 1000h         ; 64 KB anfordern/reservieren
          mov      ah, 48h           ; anfordern/reservieren:  BX = Anzahl/16
          int    21h
          jc  NOSPACE                ; keine 64 KB        = Fehler !
          mov      FILSEG, ax        ; Segment des File's
          mov      fs, ax
;----------------------------------------------------------------------------
          mov      ah, 62h           ; Segment des PSP's ermitteln
          int    21h
          mov      ds, bx            ; PSP-Segment nach DS
          mov      es, bx
          mov      di, 80h           ; Länge Kommandozeile
          mov      cl, [di]          ; nach CL
          cmp      cl, 2
          jna NOPARA
          cld                        ; aufwärts zählen
          inc      di
          mov      al, 20h
          repe scasb                 ; erste Leerzeichen überspringen
          dec      di                ; ein zurück
          mov      bp, di

SUCHCR:   cmp     BYTE PTR[di], 0Dh
          jz  short FOUND
          inc      di
          jmp SUCHCR
;------------------------------------
FOUND:    mov     WORD PTR[di], 2400h ; hinter filenamen: 0,"$"
          mov      ax, fs
          mov      cx, es
          mov      fs, cx
          mov      es, ax
;----------------------------------------------------------------------------
          mov      dx, bp            ; Zeiger auf 1.ASCII
          mov      ax, 3D02h         ; Datei öffnen: lesen/schreiben   (OPEN)
          int    21h
          jc  NOFILE                 ; File nicht gefunden = Fehler !
          mov      bx, ax

          mov      ax, DATEN
          mov      ds, ax
          xor      dx, dx            ;  low  auf Anfang stellen
          xor      cx, cx            ;  high auf Anfang stellen
          mov      ax, 4202h         ; Länge holen: vom Ende          (LSEEK)
          int    21h
          and      dx, dx            ;  High-word = null ?
          jnz TOBIG                  ; nein zurück
          mov      FILEN, ax         ; Anzahl retten

          mov      dx, 1             ; low    holen
          xor      cx, cx            ; high   holen
          mov      ax, 4200h         ; Zeiger positionieren: vom Anfang(LSEEK)
          int    21h                 ;   nochmal wegen DOS-Fehler
          xor      dx, dx            ; low    holen
          xor      cx, cx            ; high   holen
          mov      ax, 4200h         ; Zeiger positionieren: vom Anfang(LSEEK)
          int    21h

          mov      cx, FILEN         ; Anzahl zu ladender Byte's
          mov      ds, FILSEG
          mov      ah, 3Fh           ; Datei lesen u. Zeiger bewegen   (READ)
          int    21h
          mov      cx, ax            ; Anzahl tatsächlich geladener Bytes retten
          mov      ah, 3Eh           ; Datei schließen                (CLOSE)
          int    21h
;----------------------------------------------------------------------------
          mov      ax, DATEN
          mov      ds, ax
          xor      si, si
          mov      FILEN, cx

SUCHE:    cmp      si, cx            ;  Ende des File erreicht ?
          ja  short ZMA
          cmp     WORD PTR es:[si], 0A0Dh
          jz  short TEHR
          cmp     BYTE PTR es:[si], 0Ah
          jz  short FSGE
          inc      si
          jmp  short SUCHE
;------------------------------------
FSGE:     inc     WORD PTR[FILEN]
          mov      di, si
          mov      si, cx
          sub      cx, di

DGDA:     mov      al, es:[si]
          mov      es:[si+1], al
          dec      si
          dec      cx
          jnz DGDA

          mov      cx, FILEN
          mov      si, di
          mov     WORD PTR es:[di], 0A0Dh
;------------------------------------
TEHR:     add      si, 2
          jmp  short SUCHE
;----------------------------------------------------------------------------
ZMA:      mov      ax, fs
          mov      dx, 82h
          xor      cx, cx
          mov      ds, ax
          mov      ah, 3Ch           ;  Datei erstellen
          int    21h
          mov      bx, ax

          mov      ax, DATEN
          mov      ds, ax
          xor      dx, dx
          mov      cx, FILEN
          mov      ds, FILSEG
          mov      ah, 40h           ;  Datei beschreiben             (WRITE)
          int    21h
;----------------------------------------------------------------------------
NBACK:    mov      ah, 3Eh           ; Datei schließen                (CLOSE)
          int    21h

BACKE:    mov      ax, 4C00h         ; Beendigungs-Code laden
          int    21h                 ; Programm beenden, ... DOS !!!
;────────────────────────────────────────────────────────────────────────────
NOSPACE:  mov      dx, OFFSET ERRTEXT
          mov      ah, 9
          int    21h
          jmp  short BACKE
;------------------------------------
NOPARA:   mov      ax, DATEN
          mov      ds, ax
          mov      dx, OFFSET PARERR
          mov      ah, 9
          int    21h
          jmp  short BACKE
;------------------------------------
NOFILE:   mov      ax, DATEN
          mov      ds, ax
          mov      dx, OFFSET FILERR
          mov      ah, 9
          int    21h
          mov      ax, fs
          mov      ds, ax
          mov      dx, bp
          mov      ah, 9
          int    21h
          jmp  short BACKE
;------------------------------------
TOBIG:    mov      dx, OFFSET BIGERR
          mov      ah, 9
          int    21h
          jmp  short NBACK
;----------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'
;---------------------------------------------------------------------------
FILSEG    DW 0FFFFh                  ; Segment des File`s

FILEN     DW 0FFFFh                  ; Anzahl der geladenen Byte`s

FILERR    DB 0Dh, 0Ah
          DB "FEHLER ! File auf (angegebenen) Laufwerk/Pfad nicht gefunden = $"

PARERR    DB 0Dh, 0Ah
          DB "FEHLER ! Kein Filename als Parameter angehängt/übergeben !$"

ERRTEXT   DB 0Dh, 0Ah
          DB "FEHLER ! Zu wenig Arbeits-Speicher vorhanden !"
          DB 0Dh, 0Ah, 0Dh, 0Ah
          DB "Das Programm benötigt zur Ausführung, ca. 64 KB freien Arbeits-Speicher !"
          DB "$"

BIGERR    DB 0Dh, 0Ah
          DB "FEHLER ! File ist größer als 64KB !$"
;---------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
       DB 20h dup (0FFh)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end

Code: Alles auswählen

;╔════════════════════════════════════════════════════════════════════════════╗
;║                                                                            ║
;║     Dieses Programm fügt Carrige Returns(0Dh) in eine Datei mit ein,       ║
;║     dessen Name als Parameter, mit übergeben wird.                         ║
;║     Die Datei muß kleiner als 64KB groß sein.                              ║
;║                                                                            ║
;║  (C) Copyright:          Freie Cracker Crew Hamburg Horn                   ║
;║            von:                Dirk Wolfgang Glomp                         ║
;║                                                                            ║
;╚════════════════════════════════════════════════════════════════════════════╝
.MODEL SMALL                         ; Programm möglichst klein halten
.386
;────────────────────────────────────────────────────────────────────────────
  CODE SEGMENT use16 'CODE'
 assume cs:CODE,ds:DATEN,ss:STAPEL
 org 100h
;────────────────────────────────────────────────────────────────────────────
START:    mov      ax, DATEN
          mov      ds, ax

          mov      bx, ss            ; zunächst die beiden Segmentadressen
          mov      ax, es            ; voneinander abziehen. Das ergibt die
          sub      bx, ax            ; Anzahl der Paragraphen vom PSP bis
                                     ; zum Anfang des Stack
          mov      ax, sp            ; da sich der Stackpointer am Ende des
          add      ax, 0Fh           ; Stacksegments befindet, gibt sein
          shr      ax, 4             ; Inhalt die Länge des Stacks an
          add      bx, ax            ; zur bisherigen Länge hinzuaddieren
          mov      ah, 4Ah           ; neue Größe an das DOS übergeben
          int    21h

          mov      bx, 1000h         ; 64 KB anfordern/reservieren
          mov      ah, 48h           ; anfordern/reservieren:  BX = Anzahl/16
          int    21h
          jc  NOSPACE                ; keine 64 KB        = Fehler !
          mov      FILSEG, ax        ; Segment des File's
          mov      fs, ax
;----------------------------------------------------------------------------
          mov      ah, 62h           ; Segment des PSP's ermitteln
          int    21h
          mov      ds, bx            ; PSP-Segment nach DS
          mov      es, bx
          mov      di, 80h           ; Länge Kommandozeile
          mov      cl, [di]          ; nach CL
          cmp      cl, 2
          jna NOPARA
          cld                        ; aufwärts zählen
          inc      di
          mov      al, 20h
          repe scasb                 ; erste Leerzeichen überspringen
          dec      di                ; ein zurück
          mov      bp, di

SUCHCR:   cmp     BYTE PTR[di], 0Dh
          jz  short FOUND
          inc      di
          jmp SUCHCR
;------------------------------------
FOUND:    mov     WORD PTR[di], 2400h ; hinter filenamen: 0,"$"
          mov      ax, fs
          mov      cx, es
          mov      fs, cx
          mov      es, ax
;----------------------------------------------------------------------------
          mov      dx, bp            ; Zeiger auf 1.ASCII
          mov      ax, 3D02h         ; Datei öffnen: lesen/schreiben   (OPEN)
          int    21h
          jc  NOFILE                 ; File nicht gefunden = Fehler !
          mov      bx, ax

          mov      ax, DATEN
          mov      ds, ax
          xor      dx, dx            ;  low  auf Anfang stellen
          xor      cx, cx            ;  high auf Anfang stellen
          mov      ax, 4202h         ; Länge holen: vom Ende          (LSEEK)
          int    21h
          and      dx, dx            ;  High-word = null ?
          jnz TOBIG                  ; nein zurück
          mov      FILEN, ax         ; Anzahl retten

          mov      dx, 1             ; low    holen
          xor      cx, cx            ; high   holen
          mov      ax, 4200h         ; Zeiger positionieren: vom Anfang(LSEEK)
          int    21h                 ;   nochmal wegen DOS-Fehler
          xor      dx, dx            ; low    holen
          xor      cx, cx            ; high   holen
          mov      ax, 4200h         ; Zeiger positionieren: vom Anfang(LSEEK)
          int    21h

          mov      cx, FILEN         ; Anzahl zu ladender Byte's
          mov      ds, FILSEG
          mov      ah, 3Fh           ; Datei lesen u. Zeiger bewegen   (READ)
          int    21h
          mov      cx, ax            ; Anzahl tatsächlich geladener Bytes retten
          mov      ah, 3Eh           ; Datei schließen                (CLOSE)
          int    21h
;----------------------------------------------------------------------------
          mov      ax, DATEN
          mov      ds, ax
          xor      si, si
          mov      FILEN, cx

SUCHE:    cmp      si, cx            ;  Ende des File erreicht ?
          ja  short ZMA
          cmp     WORD PTR es:[si], 0A0Dh
          jz  short TEHR
          cmp     BYTE PTR es:[si], 0Ah
          jz  short FSGE
          inc      si
          jmp  short SUCHE
;------------------------------------
FSGE:     inc     WORD PTR[FILEN]
          mov      di, si
          mov      si, cx
          sub      cx, di

DGDA:     mov      al, es:[si]
          mov      es:[si+1], al
          dec      si
          dec      cx
          jnz DGDA

          mov      cx, FILEN
          mov      si, di
          mov     WORD PTR es:[di], 0A0Dh
;------------------------------------
TEHR:     add      si, 2
          jmp  short SUCHE
;----------------------------------------------------------------------------
ZMA:      mov      ax, fs
          mov      dx, 82h
          xor      cx, cx
          mov      ds, ax
          mov      ah, 3Ch           ;  Datei erstellen
          int    21h
          mov      bx, ax

          mov      ax, DATEN
          mov      ds, ax
          xor      dx, dx
          mov      cx, FILEN
          mov      ds, FILSEG
          mov      ah, 40h           ;  Datei beschreiben             (WRITE)
          int    21h
;----------------------------------------------------------------------------
NBACK:    mov      ah, 3Eh           ; Datei schließen                (CLOSE)
          int    21h

BACKE:    mov      ax, 4C00h         ; Beendigungs-Code laden
          int    21h                 ; Programm beenden, ... DOS !!!
;────────────────────────────────────────────────────────────────────────────
NOSPACE:  mov      dx, OFFSET ERRTEXT
          mov      ah, 9
          int    21h
          jmp  short BACKE
;------------------------------------
NOPARA:   mov      ax, DATEN
          mov      ds, ax
          mov      dx, OFFSET PARERR
          mov      ah, 9
          int    21h
          jmp  short BACKE
;------------------------------------
NOFILE:   mov      ax, DATEN
          mov      ds, ax
          mov      dx, OFFSET FILERR
          mov      ah, 9
          int    21h
          mov      ax, fs
          mov      ds, ax
          mov      dx, bp
          mov      ah, 9
          int    21h
          jmp  short BACKE
;------------------------------------
TOBIG:    mov      dx, OFFSET BIGERR
          mov      ah, 9
          int    21h
          jmp  short NBACK
;----------------------------------------------------------------------------
  CODE ends
;────────────────────────────────────────────────────────────────────────────
  DATEN SEGMENT use32 'DATA'
;---------------------------------------------------------------------------
FILSEG    DW 0FFFFh                  ; Segment des File`s

FILEN     DW 0FFFFh                  ; Anzahl der geladenen Byte`s

FILERR    DB 0Dh, 0Ah
          DB "FEHLER ! File auf (angegebenen) Laufwerk/Pfad nicht gefunden = $"

PARERR    DB 0Dh, 0Ah
          DB "FEHLER ! Kein Filename als Parameter angehängt/übergeben !$"

ERRTEXT   DB 0Dh, 0Ah
          DB "FEHLER ! Zu wenig Arbeits-Speicher vorhanden !"
          DB 0Dh, 0Ah, 0Dh, 0Ah
          DB "Das Programm benötigt zur Ausführung, ca. 64 KB freien Arbeits-Speicher !"
          DB "$"

BIGERR    DB 0Dh, 0Ah
          DB "FEHLER ! File ist größer als 64KB !$"
;---------------------------------------------------------------------------
  DATEN ends
;────────────────────────────────────────────────────────────────────────────
  STAPEL SEGMENT use16 STACK 'STACK'
       DB 20h dup (0FFh)
  STAPEL ends
;────────────────────────────────────────────────────────────────────────────
 end
Dirk
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Zeichenmanipulation Zeilenumbruch

Beitrag von DOSferatu »

Auf meiner Website (www.imperial-games.de) habe ich ein Tool, das ich mal geschrieben habe, namens WANDLER, das quasi für Zwecke wie diesen gemacht wurde. Es gibt auch eine deutsche Beschreibung.
Falls Fragen aufkommen, einfach fragen.
Antworten