Umlaute werden nach HTML Tags formatiert

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cremy
User
Beiträge: 3
Registriert: Mittwoch 28. Februar 2018, 13:40

Hallo zusammen,
ich bin der neue hier und habe direkt ein großes vielleicht aber auch ein kleines Anliegen.
Mit Python bin ich noch nicht sehr geübt und bekam von einem Kollegen ein Projekt geerbt.

Es wird eine SQL Datei genommen und diese wird mit Parametern via Python angereichert.
Nachdem Fileopen und filewrite werden die Umlaute in zb ä umgewandelt was aber nicht gewollt ist.
Das SQL File liegt als UTF8 vor.

Code: Alles auswählen

 # Add Spool Output to content 
    # Add an additional message that the original files were altered
    newContent  = ""
    newContent += "------------------------------------------------------------\n"
    newContent += "-- This file is altered! Should be deployed with SQL-Plus --\n"
    newContent += "------------------------------------------------------------\n"
    newContent += "\n"
    newContent += "SPOOL " + fName[:fName.index(".")] + ".spool\n"
    newContent += "ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 1;\n"
    newContent += "SET SQLBLANKLINES ON\n"

    newContent = unicode(newContent)
    # The Application file containing pages/images/etc.
    if fName.find("f"+appID) != -1:
        consolePrint(loglevel, "Application-File found!")
        newContent += "\n"
        if appInst.find("APEX") != -1:
            consolePrint(loglevel, "Application File!")
            newContent += "DELETE WWV_FLOW_WORKSHEET_CONDITIONS where flow_id = '" + appID +"';\n"

        # Append Application data
        newContent += "\n"
        newContent += "------------------------------------------------------------\n"
        newContent += "--              Contents of Application-File              --\n"
        newContent += "------------------------------------------------------------\n"
        newContent += "\n"
        newContent += fData.decode('utf-8')
        # Replace all Exit-Statements
        newContent  = newContent.replace("exit sql.sqlcode", "EXIT 0")
        newContent  = newContent.replace("EXIT SQL.SQLCODE", "EXIT 0")
        validFile = True
    elif fName.find("DBO_"+appID) != -1:
        consolePrint(loglevel, "Database-File found!")
        newContent += generateDB(appInst, wsName, fData)
        # newContent += fData.decode('utf-8')
        validFile = True

    # Write content to file
    if validFile==True:
        f = open(fName, 'wb')
        f.write(newContent.encode('ascii', 'xmlcharrefreplace'))
        f.close()
Den Teil

Code: Alles auswählen

    # Write content to file
    if validFile==True:
        f = open(fName, 'wb')
        f.write(newContent.encode('ascii', 'xmlcharrefreplace'))
        f.close()
[/code] habe ich auch bereits auf

from HTMLParser import HTMLParser # HTMLParser

Code: Alles auswählen

  parser = HTMLParser()
f.write(parser.unescape(newContent).encode('utf-8'))  geändert ohne Erfolg
geändert ohne Erfolg.

Vielleicht hat ja von euch einer eine Idee.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@cremy: wenn man nicht per `xmlcharrefreplace` anweist, dass alle Zeichen ab 127 durch &#xxx; ersetzt werden sollen, dann werden die auch nicht. Dazu braucht man auch keinen HTML-Parser. Was heißt daher "ohne Erfolg"? Kannst Du Beispiele geben was der genau Input und Output ist?

Statt `fName.find` benutzt man hier den in-Operator. Was ist fData oder generateDB? Irgendetwas per replace zu ersetzen sollte man immer mit Vorsicht machen, kann garantiert werden, dass der Ersetzungstext nicht in anderem Kontext auch vorkommen kann? Explizit auf True zu prüfen ist unnötig. Dateien schreibt man am besten per with-Statement:

Code: Alles auswählen

if validFile:
    with open(fName, 'wb') as output:
        output.write(newContent.encode('utf8'))
cremy
User
Beiträge: 3
Registriert: Mittwoch 28. Februar 2018, 13:40

danke für deinen code
ich habe dementsprechend umgebaut und bekomme nun als Ausgabe
Vertr��ge

Mein Input ist wie gesagt eine SQL Datei als UTF-8 diese muss von Python geöffnet werden und mit dem newcontent angereichert werden, dabei werden die Umlaute immer verändert

Es sollte als Ausgabe Verträge da stehen und nicht Vertr��ge.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@cremy: Du hast irgendwo ein Encoding-Problem. Wo bekommst Du die Ausgabe? Ist dort das richtige Encoding eingestellt? In welchem Encoding liegt `fData` vor?
cremy
User
Beiträge: 3
Registriert: Mittwoch 28. Februar 2018, 13:40

Ich habe dir eine Pn geschickt mit dem kompletten Code.
Hier der Auszug:

fData = fileContent
newContent += fData.decode('utf-8')
# Replace all Exit-Statements
newContent = newContent.replace("exit sql.sqlcode", "EXIT 0")
newContent = newContent.replace("EXIT SQL.SQLCODE", "EXIT 0")
validFile = True
elif fName.find("DBO_"+appID) != -1:
consolePrint(loglevel, "Database-File found!")
newContent += generateDB(appInst, wsName, fData)
# newContent += fData.decode('utf-8')
Antworten