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
bachatero18
User
Beiträge: 41
Registriert: Montag 12. August 2019, 13:57

Moin zusammen,
hab ein kleines Problem, ich hole mir den text aus einem LineEdit von qt und will diesen in byteschreib weise umwandeln um dieses zeichen in bytes zusuchen.

Also:
in dem LineEdit wird das Endzeichen reingeschrieben meistens \n oder \r

Code: Alles auswählen

print(self.ui.LineEdit_TermCharacter.text())
self.term_character = self.ui.LineEdit_TermCharacter.text().encode('utf-8')
print(self.term_character)
Mein Output ist dann:
\n
b'\\n'

So ich will aber erreichen, dass mir das jeweilige zeichen nicht escaped wird und ich bekomm es einfach nicht hin
So wie folgt geht es aber das zeichen kommt eben aus dem Lineedit element sobald ich ein raw string draus mache geht es wieder nicht

Code: Alles auswählen

test = "\n"
term_char = test.encode('utf-8)
Sirius3
User
Beiträge: 17759
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?
bachatero18
User
Beiträge: 41
Registriert: Montag 12. August 2019, 13:57

Hallo,
es sind einfach die Endzeichen von einem seriellen Geräteprotokoll die das Ende einer Nachricht signalisieren, da diese Zeichen standardmäßig wie z.b bei Hterm gesehen werden ist es einfach so festgelegt worden, so ist das manchmal mit Anforderungen. Aber escaped werden die ja nicht eingegeben sondern schon \r oder \n und nicht \\r \\n

Ich versuch mal TextEdit zu nehmen ist ein guter Hinweis.

Habs gerade mal .encode().decode('unicode-escape').encode('utf-8') damit hinbekommen aber das ist ja sehr unschön
Zuletzt geändert von bachatero18 am Mittwoch 21. Februar 2024, 14:34, insgesamt 2-mal geändert.
bachatero18
User
Beiträge: 41
Registriert: Montag 12. August 2019, 13:57

Mit einem QtextEdit hat es auch nicht geklappt selbe Symptomatik

Hätte noch jemand eine Idee?
__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: 17759
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: 13122
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".
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
bachatero18
User
Beiträge: 41
Registriert: Montag 12. August 2019, 13:57

@__blackjack__ 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.

Das behebt aber alles nicht das eigentliche Problem.

@Sirius3 wenn die die endzeichen nur hinten anhängen will könnte es so machen aber ich checke auch ob die gesendete commandos das jeweilige endzeichen enthalten und da wird nichts hart rein geschrieben sonst könnt ich mit das eingabeelement sparen.

print(repr(der_text) gibt als out put
'\\r'
__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.
bachatero18
User
Beiträge: 41
Registriert: Montag 12. August 2019, 13:57

Ich habe auch nicht gesagt ich gebe raw string ein.

Was ich nicht verstehe ist wenn man \n ins lineEdit eingibt, NICHT escaped also \n und NICHT \\n
ich dieses ausprinte und als output bekomme ich \n (für mich optisch NICHT escaped)

sobald ich .encode('utf-8') und dies ausprinte

b'\\n'

und wenn ich dann ins programm gehe und

Code: Alles auswählen

print('\n'.encode('utf-8'))
print(r'\n'.encode('utf-8'))
print('\\n'.encode('utf-8'))
bekomme ich als output:
b'\n'
b'\\n'
b'\\n'

das ist das was ich nicht verstehe
__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'
bachatero18
User
Beiträge: 41
Registriert: Montag 12. August 2019, 13:57

Das beantwortet wird meine Frage.

d.h wenn ich mir den text ausgebe wird er als CR interpretiert und genau das will ich eben nicht.

Also was wäre dann jetzt die lösung davon?
self.ui.LineEdit_TermCharacter.text().replace('\\n', '\n').encode('utf-8')

ist ja eher keine lösung da ich dann jedes möglichkeit hart reinschreiben muss \r \n \t etc. und das ist ja nicht wirklich der Sinn der Sache
__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