encode \n und \r asu einem QtLineEdit

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
Sirius3
User
Beiträge: 18400
Registriert: Sonntag 21. Oktober 2012, 17:20

Escaped werden nur Zeichen, die in Strings im Pythoncode schreibst. Wenn Du ein Lineedit hast dann ist ein \ ein Backslash-Zeichen. Wenn Du Zeilenumbrüche willst, dann benutze ein QTextEdit. Woher kommt die Anforderung, escapete Zeichen in eine GUI einzugeben?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heißt “hat nicht geklappt”? Wie genau sieht der Output aus? Was sagt print(repr(der_text))?
Sirius3
User
Beiträge: 18400
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist schon klar, dass "\n" das Zeilenende anzeigt, aber es ist halt nicht üblich dass man das genau so in ein LineEdit eingibt. Wenn Du immer eine Zeile eingibst und immer am Ende des Textes ein "\r\n" haben möchtest, dann häng das einfach an:

Code: Alles auswählen

self.term_character = self.ui.LineEdit_TermCharacter.text().encode('utf-8') + b"\r\n"
Benutzeravatar
__blackjack__
User
Beiträge: 14377
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bachatero18: Natürlich werden die escaped einegegeben. Wenn Du in ein `LineEdit` \ und dann n eingibst, dann ist sind das ja zwei Zeichen, als Zeichenkette "\\n" und nicht ein Zeichen mit dem Bytewert 10, als Zeichenkette "\n".
Who is General Failure and why is he reading my hard disk?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast das immer noch nicht verstanden: es gibt keine raw-Strings zum eingeben. raw-strings existieren AUSSSCHLIESSLICH im Code. Nicht in deinen QWidgets, und nicht in der Standardeingabe oder sonstewo. Wenn dein User \n eingibt, dann sind das ein Backslash, und ein n. So, wie das repr das ja auch ganz klar darstellt. \\r heisst "escapter \, also einfach ein \", und dann ein r.

Wenn du deinem User also damit die Moeglichkeit geben willst, whitespace einzugeben (statt einfach ein mehrzeiliges Textfeld anzubieten, das die Zeilenumbrueche natuerlich enthaelt), dann musst du *selbst* eine simple Ersetzung von "\\n".replace("\\n", "\n") vornehmen. Und mit anderen escape-Sequenzen genauso.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

bachatero18 hat geschrieben: Donnerstag 22. Februar 2024, 11:32 naja so bald ich mir den text ausprinte mit print(self.ui.LineEdit_TermCharacter.text())

bekomm ich \n also denk ich eher er wird als raw string gesetzt. Und effektiv gibt der User \n ein.
Also ich finde schon, dass du hier sagst, man gaebe einen raw-string ein.

Escaping gibt es nicht bei Texteingaben. Escaping gibt es genauso NUR im Code wie es auch NUR im Code raw-strings (die das escaping von wenigen Ausnahmen abgesehen ausschalten) gibt. Das Ergebnis von beiden String-Literal-Typen ist ein einfacher String (oder Byte-String, wenn b davor steht).

Der User, der ein \ eingibt, gibt ein \ ein. Und das war es. Da kann er danach ein n eingeben oder ein r oder ein t oder was auch immer, es hat *nicht* die Bedeutung, die

"\n"

in Code hat. Wenn du das willst, musst du es, wie schon gezeigt, EDIT ersetzen.

r"\n" im Code ist ebenfalls ein \, gefolgt von einem n. NICHT ein Neuezeilezeichen. Darum wird das auch im Interpreter mit \\n dargestellt, weil es ein Backslash gefolgt von einem n ist.

Code: Alles auswählen

>>> r"\n"
'\\n'
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also fuer die 2-3 relevanten Faelle das von Hand zu machen finde ich jetzt nicht so dramatisch. Aber tatsaechlich habe ich mal geschaut & es gibt

Code: Alles auswählen

print(rb"hallo\nwelt".decode('unicode_escape'))
Antworten