[gelöst] python unicode

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
wartburgritter
Beiträge: 269
Registriert: 01.10.2005 16:45:42
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Winterthur, selten auch Eisenach

[gelöst] python unicode

Beitrag von wartburgritter » 19.09.2013 23:15:35

Hallo zusammen,

ich beschäftige mich mit python und hab da so ein unicode-problem. Evtl. kennt sich ja hier im Forum jemand aus. Ich bekomme von einem anderen Programm strings in der Form von Eckst\\u00fctze übergeben und möchte diese als Eckstütze ausdrucken. Folgend meine Versuche.

hugo@weide:~/$ python
Python 2.7.3 (default, Jan 2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> s = "Eckst\u00fctze"
>>> s
'Eckst\\u00fctze'
>>> print(s)
>>> Eckst\u00fctze
>>> type(s)
<type 'str'>
>>>

Es ist ja prinzipiell möglich Umaute zu drucken, zum Vergleich:

>>>
>>> u = u"Eckst\u00fctze"
>>> u
>>> u'Eckst\xfctze'
>>> print(u)
>>> Eckstütze
>>> type(u)
<type 'unicode'>
>>>


Folgend mein fehlgeschlagener Versuch

>>> t = unicode(s)
>>> t
u'Eckst\\u00fctze'
>>> print t
Eckst\u00fctze
>>> type(t)
<type 'unicode'>
>>>


gruss bernd
Zuletzt geändert von wartburgritter am 20.09.2013 19:29:55, insgesamt 1-mal geändert.
Stand März 2020:
Desktop Lenovo ThinkPad X1 mit Debian Buster (super kiste, aber der akku macht nach nunmehr 3 Jahren schlapp)
Fileserver veralte hardware mit neuer grosser hd mit Debian Lenny (ich sollte den wirklich mal ersetzen ... )
Mobiltelefon Sony Xperia mit SailfishOS
Tablet BQ aquaris M10 mit Ubuntu Touch

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: python unicode

Beitrag von Cae » 20.09.2013 00:35:21

Code: Alles auswählen

>>> s = u'Eckst\u00fctze'
>>> s
u'Eckst\xfctze'
>>> print s
Eckstütze
>>> t = unicode(s)
>>> t
u'Eckst\xfctze'
>>> print t
Eckstütze
>>> 
Kann dein Terminal vielleicht kein UTF-8? locale, env | grep '^LC'?

Wobei, kann nicht recht sein, da beschwert sich der Interpreter:

Code: Alles auswählen

$ LC_ALL=c python
[...]
>>> print u'te\u00fcst'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128)
>>> 
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

wartburgritter
Beiträge: 269
Registriert: 01.10.2005 16:45:42
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Winterthur, selten auch Eisenach

Re: python unicode

Beitrag von wartburgritter » 20.09.2013 07:35:31

Aha, es könnte auch am Terminal liegen, daran habe ich nochgar nicht gedacht, aber meins ist utf-8. Die variable des typs u'string' wird ja korrekt gedruckt, nur eben der std-string mit den encodings nicht.

Code: Alles auswählen

hugo@weide:~$ 
hugo@weide:~$ locale
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
hugo@weide:~$ 
hugo@weide:~$ env | grep 'LC'
hugo@weide:~$ 
hugo@weide:~$ 
hugo@weide:~$ LC_ALL=c python
Python 2.7.3 (default, Jan  2 2013, 13:56:14) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> print u'te\u00fcst'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128)
>>> 
gruss bernd
Stand März 2020:
Desktop Lenovo ThinkPad X1 mit Debian Buster (super kiste, aber der akku macht nach nunmehr 3 Jahren schlapp)
Fileserver veralte hardware mit neuer grosser hd mit Debian Lenny (ich sollte den wirklich mal ersetzen ... )
Mobiltelefon Sony Xperia mit SailfishOS
Tablet BQ aquaris M10 mit Ubuntu Touch

Benutzeravatar
JaKlaRo
Beiträge: 121
Registriert: 06.03.2008 15:00:00
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: python unicode

Beitrag von JaKlaRo » 20.09.2013 10:53:48

Hallo,
das Problem ist, dass ein Rawstring übergeben wird. Mit dem folgendem Code läßt sich Dein Problem lösen.

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: utf-8 -*-

def str_to_utf8(s):
    if '\\u00c4' in s:
        s = s.replace("\\u00c4", "Ä")
    if '\\u00e4' in s:
        s = s.replace("\\u00e4", "ä")
    if '\\u00d6' in s:
        s = s.replace("\\u00d6", "Ö")
    if '\\u00f6' in s:
        s= s.replace("\\u00f6", "ö")
    if '\\u00dc' in s:
        s = s.replace("\\u00dc", "Ü")
    if '\\u00fc' in s:
        s = s.replace("\\u00fc", "ü")
    if '\\u00df' in s:
        s = s.replace("\\u00df", "ß")
    return s


def main():
    s = "Eckst\u00fctze Eckst\u00fctze B\u00e4r"
    print s
    u=str_to_utf8(s)
    print u

if __name__=="__main__":
    main()
Gruß
JaKlaRo

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: python unicode

Beitrag von goeb » 20.09.2013 11:39:14

Und das dann für jeden Codepoint oder wie? Nach kurzem startpagen doch eher so:

Code: Alles auswählen

>>> s = "Eckst\u00fctze Eckst\u00fctze B\u00e4r"

>>> print s
Eckst\u00fctze Eckst\u00fctze B\u00e4r

>>> s.decode ('unicode-escape')
u'Eckst\xfctze Eckst\xfctze B\xe4r'

>>> print s.decode ('unicode-escape')
Eckstütze Eckstütze Bär
Edit: Der Vollständigkeit halber, so geht's auch:

Code: Alles auswählen

>>> s = "Eckst\u00fctze Eckst\u00fctze B\u00e4r"

>>> print unicode (s, 'unicode-escape')
Eckstütze Eckstütze Bär

wartburgritter
Beiträge: 269
Registriert: 01.10.2005 16:45:42
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Winterthur, selten auch Eisenach

Re: python unicode

Beitrag von wartburgritter » 20.09.2013 19:32:45

goeb hat geschrieben:...
>>> s.decode ('unicode-escape')
...
[/code]
Genau das hab ich verzweifelt gesucht :evil: :evil: :evil:

Vielen vielen Dank Euch allen für die Unterstützung :D :D :D

Bernd alias der wartburgritter
Stand März 2020:
Desktop Lenovo ThinkPad X1 mit Debian Buster (super kiste, aber der akku macht nach nunmehr 3 Jahren schlapp)
Fileserver veralte hardware mit neuer grosser hd mit Debian Lenny (ich sollte den wirklich mal ersetzen ... )
Mobiltelefon Sony Xperia mit SailfishOS
Tablet BQ aquaris M10 mit Ubuntu Touch

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [gelöst] python unicode

Beitrag von Cae » 20.09.2013 23:12:48

Man kann das entweder wissen oder auch per dir(s) gucken, was es im Objekt so alles gibt. Da waere der .decode()-Eintrag gelistet werden, wobei man ihn wohl eher nicht als zustaendig erkannt haette. Generell kann man mit dieser Methode nach sprechenden Bezeichnern suchen und gucken, ob sie weiterhelfen.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

wartburgritter
Beiträge: 269
Registriert: 01.10.2005 16:45:42
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Winterthur, selten auch Eisenach

Re: [gelöst] python unicode

Beitrag von wartburgritter » 28.09.2013 14:34:00

[quote="Cae"]Man kann das entweder wissen oder auch per dir(s) gucken, was es im Objekt so alles gibt. .../quote]

Aha, das dir ist auch auf Variablen anwendbar, naja macht sinn. Ich gab es bisher immer nur für funktionen aus modulen verwendet. Aber naklar, wieder was gelernt. Decodierung meiner Umlaute funktioniert übrigends bestens ... :D :D :D
Bernd
Stand März 2020:
Desktop Lenovo ThinkPad X1 mit Debian Buster (super kiste, aber der akku macht nach nunmehr 3 Jahren schlapp)
Fileserver veralte hardware mit neuer grosser hd mit Debian Lenny (ich sollte den wirklich mal ersetzen ... )
Mobiltelefon Sony Xperia mit SailfishOS
Tablet BQ aquaris M10 mit Ubuntu Touch

Antworten