Discussion:
Niemieckie znaki narodowe i unicode
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Seweryn Habdank-Wojewódzki
2008-06-27 07:41:58 UTC
Permalink
Witam

Mam pytanie o znaki znajdujace sie powyzej wartosci 128.
Klawiatura niemiecka zawiera (a,o,u) umlaut, Euro i jeszcze pare
innych.

Kiedy napisze:

'ciag znakow zawierajacych te litery'

to wszystko jest w porzadku otrzymuje obiekt typu 'str'.

Kiedy jednak probuje zanicjalizowac typ unicode tym ciagiem dostaje
blad:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xf6 in position
3:
ordinal not in range(128)

# dla wyjasnienia 0xf6 to o umlaut

Jak to elegancko zrobic, aby zamienic te znaki z zakresu 128 - 255 na
unicode?

a umlaut ma kod 228,
o umlaut ma kod 246,
u umlaut ma kod 252

Pozdrawiam,
Seweryn Habdank-Wojewodzki.
Jarek Zgoda
2008-06-27 08:58:35 UTC
Permalink
Post by Seweryn Habdank-Wojewódzki
Witam
Mam pytanie o znaki znajdujace sie powyzej wartosci 128.
Klawiatura niemiecka zawiera (a,o,u) umlaut, Euro i jeszcze pare
innych.
'ciag znakow zawierajacych te litery'
to wszystko jest w porzadku otrzymuje obiekt typu 'str'.
Kiedy jednak probuje zanicjalizowac typ unicode tym ciagiem dostaje
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf6 in position
ordinal not in range(128)
# dla wyjasnienia 0xf6 to o umlaut
Jak to elegancko zrobic, aby zamienic te znaki z zakresu 128 - 255 na
unicode?
a umlaut ma kod 228,
o umlaut ma kod 246,
u umlaut ma kod 252
Odkodować z kodowania, w jakim je wprowadziłeś. Jeżeli Twój terminal ma
kodowanie UTF-8, to entered_text.decode('utf-8') lub
unicode(entered_text, 'utf-8').
--
Jarek Zgoda
http://zgodowie.org/

"We read Knuth so you don't have to" - Tim Peters
Rob Wolfe
2008-06-27 09:02:01 UTC
Permalink
Post by Seweryn Habdank-Wojewódzki
Witam
Mam pytanie o znaki znajdujace sie powyzej wartosci 128.
Klawiatura niemiecka zawiera (a,o,u) umlaut, Euro i jeszcze pare
innych.
'ciag znakow zawierajacych te litery'
to wszystko jest w porzadku otrzymuje obiekt typu 'str'.
Kiedy jednak probuje zanicjalizowac typ unicode tym ciagiem dostaje
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf6 in position
ordinal not in range(128)
# dla wyjasnienia 0xf6 to o umlaut
Jak to elegancko zrobic, aby zamienic te znaki z zakresu 128 - 255 na
unicode?
Po pierwsze musisz wiedziec w jakim kodowaniu sa podawane te umlauty.
Post by Seweryn Habdank-Wojewódzki
s = '\xf6'
type(s)
<type 'str'>
Post by Seweryn Habdank-Wojewódzki
u = s.decode('iso-8859-2')
type(u)
<type 'unicode'>
Post by Seweryn Habdank-Wojewódzki
print u
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in
position 0: ordinal not in range(128)
Post by Seweryn Habdank-Wojewódzki
print u.encode('iso-8859-2')
ö

Czyli generalnie `decode` zamienia `str` na `unicode`, a `encode` w
przeciwna strone.

RW
Seweryn Habdank-Wojewódzki
2008-06-27 17:44:28 UTC
Permalink
Witam
Post by Rob Wolfe
Po pierwsze musisz wiedziec w jakim kodowaniu sa podawane te umlauty.
Tak mi sie wydaje, ale pewnosci nie mam. Czy da sie to jakoś
sprawdzić?
Post by Rob Wolfe
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in
position 0: ordinal not in range(128)>>> print u.encode('iso-8859-2')
ö
O widzisz chyba to jest to czego szukam.
Post by Rob Wolfe
Czyli generalnie `decode` zamienia `str` na `unicode`, a `encode` w
przeciwna strone.
Super. Dzięki.

Pozdrawiam,
Seweryn Habdank-Wojewodzki.
Rob Wolfe
2008-06-27 18:25:31 UTC
Permalink
Post by Seweryn Habdank-Wojewódzki
Witam
Post by Rob Wolfe
Po pierwsze musisz wiedziec w jakim kodowaniu sa podawane te umlauty.
Tak mi sie wydaje, ale pewnosci nie mam. Czy da sie to jakoś
sprawdzić?
Odpowiedź krótka: nie da się. ;)

Odpowiedź długa:
Przy odrobinie wysiłku, szczęścia i dostatecznej ilości danych
można to próbować odgadnąć:
http://chardet.feedparser.org/

RW
William
2008-06-30 08:29:41 UTC
Permalink
Post by Rob Wolfe
Post by Seweryn Habdank-Wojewódzki
Witam
Post by Rob Wolfe
Po pierwsze musisz wiedziec w jakim kodowaniu sa podawane te umlauty.
Tak mi sie wydaje, ale pewnosci nie mam. Czy da sie to jakoś
sprawdzić?
Odpowiedź krótka: nie da się. ;)
Przy odrobinie wysiłku, szczęścia i dostatecznej ilości danych
http://chardet.feedparser.org/
Czasem działa sys.stdin.encoding
Seweryn Habdank-Wojewódzki
2008-07-01 07:37:01 UTC
Permalink
Witam
Post by William
Post by Rob Wolfe
Odpowiedź krótka: nie da się. ;)
Przy odrobinie wysiłku, szczęścia i dostatecznej ilości danych
http://chardet.feedparser.org/
Czasem działa sys.stdin.encoding
Dziekuje wszystkim za pomoc przy DE-znaczkach.

Pozdrawiam,
Seweryn Habdank-Wojewodzki.

William
2008-06-27 09:09:12 UTC
Permalink
Post by Seweryn Habdank-Wojewódzki
# dla wyjasnienia 0xf6 to o umlaut
No wlasnie. Nam wyjasniles, a interpreterowi nie :). Umiesc na poczatku
pliku zródlowego
# -*- coding: <encoding-name> -*-
Jarek Zgoda
2008-06-27 11:19:48 UTC
Permalink
Post by William
Post by Seweryn Habdank-Wojewódzki
# dla wyjasnienia 0xf6 to o umlaut
No wlasnie. Nam wyjasniles, a interpreterowi nie :). Umiesc na poczatku
pliku zródlowego
# -*- coding: <encoding-name> -*-
Przecież to służy tylko do odkodowywania stałych napisowych. Dla
odkodowywania zmiennych nie ma to żadnego znaczenia.
--
Jarek Zgoda
http://zgodowie.org/

"We read Knuth so you don't have to" - Tim Peters
William
2008-06-27 12:38:35 UTC
Permalink
Post by Jarek Zgoda
Post by William
Post by Seweryn Habdank-Wojewódzki
# dla wyjasnienia 0xf6 to o umlaut
No wlasnie. Nam wyjasniles, a interpreterowi nie :). Umiesc na poczatku
pliku zródlowego
# -*- coding: <encoding-name> -*-
Przecież to służy tylko do odkodowywania stałych napisowych. Dla
odkodowywania zmiennych nie ma to żadnego znaczenia.
Kolega ma własnie problem z literałami w programie.
Seweryn Habdank-Wojewódzki
2008-06-27 17:40:52 UTC
Permalink
Witam
Post by William
Kolega ma własnie problem z literałami w programie.
Nie! :-)

Chodzi o wpisywany tekst z klawiatury w terminalu.
W kodzie nie mam żadnych DE-znaczków. Całe szczęście :-).

Juz kiedys walczyłem ze zmiennymi typu:
"DrahtkaltwalzwerkKoeffizient".

Pozdrawiam i dziękuję za odpowiedzi,
Seweryn Habdank-Wojewodzki.
Loading...