Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.programming > #29040 > unrolled thread

python i stringi

Started byRoman Tyczka <noemail@because.no>
First post2016-10-06 09:46 +0200
Last post2016-10-06 11:50 +0200
Articles 11 — 3 participants

Back to article view | Back to pl.comp.programming


Contents

  python i stringi Roman Tyczka <noemail@because.no> - 2016-10-06 09:46 +0200
    Re: python i stringi godek.maciek@gmail.com - 2016-10-06 01:10 -0700
      Re: python i stringi Roman Tyczka <noemail@because.no> - 2016-10-06 10:19 +0200
        Re: python i stringi godek.maciek@gmail.com - 2016-10-06 01:32 -0700
          Re: python i stringi Roman Tyczka <noemail@because.no> - 2016-10-06 10:44 +0200
            Re: python i stringi Piotr Chamera <piotr_chamera@poczta.onet.pl> - 2016-10-06 12:14 +0200
              Re: python i stringi Roman Tyczka <noemail@because.no> - 2016-10-06 12:32 +0200
                Re: python i stringi Piotr Chamera <piotr_chamera@poczta.onet.pl> - 2016-10-06 13:22 +0200
    Re: python i stringi Piotr Chamera <piotr_chamera@poczta.onet.pl> - 2016-10-06 10:57 +0200
      Re: python i stringi Roman Tyczka <noemail@because.no> - 2016-10-06 11:22 +0200
        Re: python i stringi Piotr Chamera <piotr_chamera@poczta.onet.pl> - 2016-10-06 11:50 +0200

#29040 — python i stringi

FromRoman Tyczka <noemail@because.no>
Date2016-10-06 09:46 +0200
Subjectpython i stringi
Message-ID<19jwk9uqtvyxa.dlg@tyczka.com>
Witam,

Używam czasami pythonowej konsoli jako kalkulatora, teraz zapragnąłem
policzyć md5 unicodowego stringa, jednak nie znam pythona jeszcze zbytnio i
się zawiesiłem:

>>> import hashlib
>>> ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi znakami 0099786764553 na końcu"
>>> type(ustr)
<type 'unicode'>
>>> hashlib.md5(ustr).hexdigest()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in
position 9: ordinal not in range(128)

Jak wybrnąć i policzyć jednak tego hasha?

ps. python 2.7.9 na windows

-- 
pozdrawiam
Roman Tyczka

[toc] | [next] | [standalone]


#29041

Fromgodek.maciek@gmail.com
Date2016-10-06 01:10 -0700
Message-ID<c6b8c3a0-596d-445b-9951-5c16248b11b9@googlegroups.com>
In reply to#29040
W dniu czwartek, 6 października 2016 09:46:26 UTC+2 użytkownik Roman Tyczka napisał:
> Witam,
> 
> Używam czasami pythonowej konsoli jako kalkulatora, teraz zapragnąłem
> policzyć md5 unicodowego stringa, jednak nie znam pythona jeszcze zbytnio i
> się zawiesiłem:
> 
> >>> import hashlib
> >>> ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi znakami 0099786764553 na końcu"
> >>> type(ustr)
> <type 'unicode'>
> >>> hashlib.md5(ustr).hexdigest()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in
> position 9: ordinal not in range(128)
> 
> Jak wybrnąć i policzyć jednak tego hasha?
> 
> ps. python 2.7.9 na windows

może np. google python unicode to ascii

[toc] | [prev] | [next] | [standalone]


#29042

FromRoman Tyczka <noemail@because.no>
Date2016-10-06 10:19 +0200
Message-ID<zdk42d2gkady.dlg@tyczka.com>
In reply to#29041
On Thu, 6 Oct 2016 01:10:29 -0700 (PDT), godek.maciek@gmail.com wrote:

>>>>> ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi znakami 0099786764553 na końcu"
>>>>> type(ustr)
>> <type 'unicode'>
>>>>> hashlib.md5(ustr).hexdigest()
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>> UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in
>> position 9: ordinal not in range(128)
>> 
>> Jak wybrnąć i policzyć jednak tego hasha?
>> 
>> ps. python 2.7.9 na windows
> 
> może np. google python unicode to ascii

Po pierwsze nie da się konwertować unicode do ascii.

Poza tym ja nic nie chcę konwertować, chcę by był potraktowany jako
unicodowy właśnie, czyli de facto dwubajtowy znak.

-- 
pozdrawiam
Roman Tyczka

[toc] | [prev] | [next] | [standalone]


#29043

Fromgodek.maciek@gmail.com
Date2016-10-06 01:32 -0700
Message-ID<aba1993f-ebae-4a5c-88d3-42b46e803a3a@googlegroups.com>
In reply to#29042
W dniu czwartek, 6 października 2016 10:19:26 UTC+2 użytkownik Roman Tyczka 
> >>>>> ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi znakami 0099786764553 na końcu"
> >>>>> type(ustr)
> >> <type 'unicode'>
> >>>>> hashlib.md5(ustr).hexdigest()
> >> Traceback (most recent call last):
> >>   File "<stdin>", line 1, in <module>
> >> UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in
> >> position 9: ordinal not in range(128)
> >> 
> >> Jak wybrnąć i policzyć jednak tego hasha?
> >> 
> >> ps. python 2.7.9 na windows
> > 
> > może np. google python unicode to ascii
> 
> Po pierwsze nie da się konwertować unicode do ascii.
> 
> Poza tym ja nic nie chcę konwertować, chcę by był potraktowany jako
> unicodowy właśnie, czyli de facto dwubajtowy znak.

to może google python unicode to bytes
python bytes to string
python md5 unicode

[toc] | [prev] | [next] | [standalone]


#29044

FromRoman Tyczka <noemail@because.no>
Date2016-10-06 10:44 +0200
Message-ID<8uxdbqmk73pz.dlg@tyczka.com>
In reply to#29043
On Thu, 6 Oct 2016 01:32:07 -0700 (PDT), godek.maciek@gmail.com wrote:

> W dniu czwartek, 6 października 2016 10:19:26 UTC+2 użytkownik Roman Tyczka 
>>>>>>> ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi znakami 0099786764553 na końcu"
>>>>>>> type(ustr)
>>>> <type 'unicode'>
>>>>>>> hashlib.md5(ustr).hexdigest()
>>>> Traceback (most recent call last):
>>>>   File "<stdin>", line 1, in <module>
>>>> UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in
>>>> position 9: ordinal not in range(128)
>>>> 
>>>> Jak wybrnąć i policzyć jednak tego hasha?
>>>> 
>>>> ps. python 2.7.9 na windows
>>> 
>>> może np. google python unicode to ascii
>> 
>> Po pierwsze nie da się konwertować unicode do ascii.
>> 
>> Poza tym ja nic nie chcę konwertować, chcę by był potraktowany jako
>> unicodowy właśnie, czyli de facto dwubajtowy znak.
> 
> to może google python unicode to bytes
> python bytes to string
> python md5 unicode

Jeśli chcesz mi utrzeć nosa tym googlem to ...hmmm, niepotrzebnie. Od
googla zacząłem. Ale ok, może grupa dyskusyjna służy tylko do kłótni o
pascala.
Tak czy owak problem rozwiązałem, nie konwertując do ascii czy tablicy
bajtów, ale poprawnie deklarując typ unicodowego stringa. I na taką
praktyczną radę liczyłem.

Dla potomnych:

ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi
znakami 0099786764553 na końcu".encode('utf-16le')

i ten mały indianin zrobił swoją robotę :-)

-- 
pozdrawiam
Roman Tyczka

[toc] | [prev] | [next] | [standalone]


#29048

FromPiotr Chamera <piotr_chamera@poczta.onet.pl>
Date2016-10-06 12:14 +0200
Message-ID<nt584q$gi$1@dont-email.me>
In reply to#29044
W dniu 2016-10-06 o 10:44, Roman Tyczka pisze:
> On Thu, 6 Oct 2016 01:32:07 -0700 (PDT), godek.maciek@gmail.com wrote:
>
>> W dniu czwartek, 6 października 2016 10:19:26 UTC+2 użytkownik Roman Tyczka
>>>>>>>> ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi znakami 0099786764553 na końcu"
>>>>>>>> type(ustr)
>>>>> <type 'unicode'>
>>>>>>>> hashlib.md5(ustr).hexdigest()
>>>>> Traceback (most recent call last):
>>>>>   File "<stdin>", line 1, in <module>
>>>>> UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in
>>>>> position 9: ordinal not in range(128)
>>>>>
>>>>> Jak wybrnąć i policzyć jednak tego hasha?
>>>>>
>>>>> ps. python 2.7.9 na windows
>>>>
>>>> może np. google python unicode to ascii
>>>
>>> Po pierwsze nie da się konwertować unicode do ascii.
>>>
>>> Poza tym ja nic nie chcę konwertować, chcę by był potraktowany jako
>>> unicodowy właśnie, czyli de facto dwubajtowy znak.
>>
>> to może google python unicode to bytes
>> python bytes to string
>> python md5 unicode
>
> Jeśli chcesz mi utrzeć nosa tym googlem to ...hmmm, niepotrzebnie. Od
> googla zacząłem. Ale ok, może grupa dyskusyjna służy tylko do kłótni o
> pascala.
> Tak czy owak problem rozwiązałem, nie konwertując do ascii czy tablicy
> bajtów, ale poprawnie deklarując typ unicodowego stringa. I na taką
> praktyczną radę liczyłem.

Dla jasności – nie zadeklarowałeś typu unicodowego stringa, ale za 
pomocą metody (encode) obiektu (ustr, typu unicode) utworzyłeś nowy
ciąg bajtów reprezentujący ten ciąg znaków w kodowaniu, które podałeś 
jako argument metody. Obiekt pod zmienną „ustr” pozostał niezmieniony.

> Dla potomnych:
>
> ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi
> znakami 0099786764553 na końcu".encode('utf-16le')
>
> i ten mały indianin zrobił swoją robotę :-)
>

[toc] | [prev] | [next] | [standalone]


#29049

FromRoman Tyczka <noemail@because.no>
Date2016-10-06 12:32 +0200
Message-ID<h6zbunvyf6b0.dlg@tyczka.com>
In reply to#29048
On Thu, 6 Oct 2016 12:14:00 +0200, Piotr Chamera wrote:

>> Jeśli chcesz mi utrzeć nosa tym googlem to ...hmmm, niepotrzebnie. Od
>> googla zacząłem. Ale ok, może grupa dyskusyjna służy tylko do kłótni o
>> pascala.
>> Tak czy owak problem rozwiązałem, nie konwertując do ascii czy tablicy
>> bajtów, ale poprawnie deklarując typ unicodowego stringa. I na taką
>> praktyczną radę liczyłem.
> 
> Dla jasności – nie zadeklarowałeś typu unicodowego stringa, ale za 
> pomocą metody (encode) obiektu (ustr, typu unicode) utworzyłeś nowy
> ciąg bajtów reprezentujący ten ciąg znaków w kodowaniu, które podałeś 
> jako argument metody. Obiekt pod zmienną „ustr” pozostał niezmieniony.

Obiekt został zmieniony, ale nie w sensie adresu/instancji, lecz zmienił
się jego stan wewnętrzny, czyli tablica bajtów zawierająca łańcuch :-)

thx za pomoc

-- 
pozdrawiam
Roman Tyczka

[toc] | [prev] | [next] | [standalone]


#29050

FromPiotr Chamera <piotr_chamera@poczta.onet.pl>
Date2016-10-06 13:22 +0200
Message-ID<nt5c60$co5$1@dont-email.me>
In reply to#29049
W dniu 2016-10-06 o 12:32, Roman Tyczka pisze:
> On Thu, 6 Oct 2016 12:14:00 +0200, Piotr Chamera wrote:
>
>>> Jeśli chcesz mi utrzeć nosa tym googlem to ...hmmm, niepotrzebnie. Od
>>> googla zacząłem. Ale ok, może grupa dyskusyjna służy tylko do kłótni o
>>> pascala.
>>> Tak czy owak problem rozwiązałem, nie konwertując do ascii czy tablicy
>>> bajtów, ale poprawnie deklarując typ unicodowego stringa. I na taką
>>> praktyczną radę liczyłem.
>>
>> Dla jasności – nie zadeklarowałeś typu unicodowego stringa, ale za
>> pomocą metody (encode) obiektu (ustr, typu unicode) utworzyłeś nowy
>> ciąg bajtów reprezentujący ten ciąg znaków w kodowaniu, które podałeś
>> jako argument metody. Obiekt pod zmienną „ustr” pozostał niezmieniony.
>
> Obiekt został zmieniony, ale nie w sensie adresu/instancji, lecz zmienił
> się jego stan wewnętrzny, czyli tablica bajtów zawierająca łańcuch :-)

Może trochę namieszałem. Chodzi o to, że do zmiennej ustr, przypisałeś
zupełnie nowy obiekt, ciąg bajtów utworzony przez metodę encode,
zawierający reprezentację stringa w postaci ciągu bajtów zgodnego
z zadanym kodowaniem.

Czyli to zdanie:
 >>> Tak czy owak problem rozwiązałem, nie konwertując do ascii czy
 >>> tablicy bajtów, ale poprawnie deklarując typ unicodowego stringa.
jest nieprawdziwe. Oryginalny obiekt typu unicode nie został zmieniony.

Pamiętaj, że zmienne w pythonie są tylko etykietkami (wskaźnikami) do
obiektów.

Rozważ taki ciąg działań

 >>> ustr = u"test ąę"
 >>> type(ustr)
<type 'unicode'>

 >>> id(ustr)
58766080L
 >>> ustr2 = ustr
 >>> id(ustr2)
58766080L

id obiektów podpiętych pod zmienne jest takie samo, obie pokazują na ten 
sam obiekt

 >>> ustr = ustr.encode('utf-16le')

teraz do ustr przypisaliśmy nowy obiekt o innym id (trzeba pamiętać, że 
w pythonie 2.x typ 'str' i ciąg bajtów to to samo)

 >>> id(ustr)
58767040L
 >>> type(ustr)
<type 'str'>

ale poprzedni obiekt pozostał niezmieniony, chociaż teraz jest już 
przypięty tylko do zmiennej ustr2.

 >>> id(ustr2)
58766080L
 >>> ustr2
u'test \u0105\u0119'

[toc] | [prev] | [next] | [standalone]


#29045

FromPiotr Chamera <piotr_chamera@poczta.onet.pl>
Date2016-10-06 10:57 +0200
Message-ID<nt53kl$ia8$1@dont-email.me>
In reply to#29040
W dniu 2016-10-06 o 09:46, Roman Tyczka pisze:
> Witam,
>
> Używam czasami pythonowej konsoli jako kalkulatora, teraz zapragnąłem
> policzyć md5 unicodowego stringa, jednak nie znam pythona jeszcze zbytnio i
> się zawiesiłem:
>
>>>> import hashlib
>>>> ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi znakami 0099786764553 na końcu"
>>>> type(ustr)
> <type 'unicode'>
>>>> hashlib.md5(ustr).hexdigest()
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> UnicodeEncodeError: 'ascii' codec can't encode character u'\u0142' in
> position 9: ordinal not in range(128)
>
> Jak wybrnąć i policzyć jednak tego hasha?
>
> ps. python 2.7.9 na windows
>

np tak:
 >>> hashlib.md5(ustr.encode(encoding="utf-8", errors="strict")).hexdigest()

'32857a03910f204bd5adc4cb2ec2bce8'

lub tak:
 >>> hashlib.md5(ustr.encode(encoding="utf-16", 
errors="strict")).hexdigest()

'5da8f084e4da17f9441beccf2fa8b437'

czyli trzeba jawnie skonwertować tekst unicode do takiego formatu, z 
jakiego chcemy liczyć md5

[toc] | [prev] | [next] | [standalone]


#29046

FromRoman Tyczka <noemail@because.no>
Date2016-10-06 11:22 +0200
Message-ID<1b3k49416pl4p$.dlg@tyczka.com>
In reply to#29045
On Thu, 6 Oct 2016 10:57:07 +0200, Piotr Chamera wrote:

>> Jak wybrnąć i policzyć jednak tego hasha?
>>
>> ps. python 2.7.9 na windows
>>
> 
> np tak:
>  >>> hashlib.md5(ustr.encode(encoding="utf-8", errors="strict")).hexdigest()
> 
> '32857a03910f204bd5adc4cb2ec2bce8'
> 
> lub tak:
>  >>> hashlib.md5(ustr.encode(encoding="utf-16", 
> errors="strict")).hexdigest()
> 
> '5da8f084e4da17f9441beccf2fa8b437'
> 
> czyli trzeba jawnie skonwertować tekst unicode do takiego formatu, z 
> jakiego chcemy liczyć md5

A jaki jest domyślny format, gdy zmienną utworzyłem tak:

>>> ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi znakami 0099786764553 na końcu"
>>> type(ustr)
<type 'unicode'>

To jest utf-8? 16? 32?

-- 
pozdrawiam
Roman Tyczka

[toc] | [prev] | [next] | [standalone]


#29047

FromPiotr Chamera <piotr_chamera@poczta.onet.pl>
Date2016-10-06 11:50 +0200
Message-ID<nt56ph$s0u$1@dont-email.me>
In reply to#29046
W dniu 2016-10-06 o 11:22, Roman Tyczka pisze:
> On Thu, 6 Oct 2016 10:57:07 +0200, Piotr Chamera wrote:
>
>>> Jak wybrnąć i policzyć jednak tego hasha?
>>>
>>> ps. python 2.7.9 na windows
>>>
>>
>> np tak:
>>  >>> hashlib.md5(ustr.encode(encoding="utf-8", errors="strict")).hexdigest()
>>
>> '32857a03910f204bd5adc4cb2ec2bce8'
>>
>> lub tak:
>>  >>> hashlib.md5(ustr.encode(encoding="utf-16",
>> errors="strict")).hexdigest()
>>
>> '5da8f084e4da17f9441beccf2fa8b437'
>>
>> czyli trzeba jawnie skonwertować tekst unicode do takiego formatu, z
>> jakiego chcemy liczyć md5
>
> A jaki jest domyślny format, gdy zmienną utworzyłem tak:
>
>>>> ustr = u"Jeszcze dłuższy i bardzo długi string z ółęść oraz ;%$#@[ i innymi znakami 0099786764553 na końcu"
>>>> type(ustr)
> <type 'unicode'>
>
> To jest utf-8? 16? 32?
>
String na wejściu jest wg kodowania ustawionego na konsoli lub w pliku 
(często jest to utf-8, w pythonie 3 pliki źródłowe domyślnie są czytane 
jako utf-8, w 2.x trzeba to było zadeklarować na początku pliku) 
konwertowany do wewnętrznej reprezentacji.

String unicode w pythonie potrafi reprezentować wszystkie znaki 
standardu unicode (chyba), ale nie wiemy (nie potrzebujemy wiedzieć) w 
jakim formacie jest trzymany w pamięci (czy jako liczba 32 bitowa w 
wersji 32bit, a 64 bitowa na procesorach 64 bit, czy jakiś inny obiekt).

Jeśli potrzebujemy konwersji na ciąg w określonym formacie, musimy to 
jawnie przekodować na ciąg bajtów, np.:
 >>> ustr.encode(encoding="utf-32", errors="strict")
'\xff\xfe\x00\x00J\x00\x00\x00e\x00\x00\x00s\x00\x00\x00z\x00\x00\x00c\x00\x00\x00z\x00\x00\x00e\x00\x00\x00 
\x00\x00\x00d\x00\x00\x00B\x01\x00\x00u\x00\x00\x00|\x01\x00\x00s\x00\x00\x00z\x00\x00\x00y\x00\x00\x00 
\x00\x00\x00i\x00\x00\x00 
\x00\x00\x00b\x00\x00\x00a\x00\x00\x00r\x00\x00\x00d\x00\x00\x00z\x00\x00\x00o\x00\x00\x00 
\x00\x00\x00d\x00\x00\x00B\x01\x00\x00u\x00\x00\x00g\x00\x00\x00i\x00\x00\x00 
\x00\x00\x00s\x00\x00\x00t\x00\x00\x00r\x00\x00\x00i\x00\x00\x00n\x00\x00\x00g\x00\x00\x00 
\x00\x00\x00z\x00\x00\x00 
\x00\x00\x00\xf3\x00\x00\x00B\x01\x00\x00\x19\x01\x00\x00[\x01\x00\x00\x07\x01\x00\x00 
\x00\x00\x00o\x00\x00\x00r\x00\x00\x00a\x00\x00\x00z\x00\x00\x00 
\x00\x00\x00;\x00\x00\x00%\x00\x00\x00$\x00\x00\x00#\x00\x00\x00@\x00\x00\x00[\x00\x00\x00 
\x00\x00\x00i\x00\x00\x00 
\x00\x00\x00i\x00\x00\x00n\x00\x00\x00n\x00\x00\x00y\x00\x00\x00m\x00\x00\x00i\x00\x00\x00 
\x00\x00\x00z\x00\x00\x00n\x00\x00\x00a\x00\x00\x00k\x00\x00\x00a\x00\x00\x00m\x00\x00\x00i\x00\x00\x00 
\x00\x00\x000\x00\x00\x000\x00\x00\x009\x00\x00\x009\x00\x00\x007\x00\x00\x008\x00\x00\x006\x00\x00\x007\x00\x00\x006\x00\x00\x004\x00\x00\x005\x00\x00\x005\x00\x00\x003\x00\x00\x00 
\x00\x00\x00n\x00\x00\x00a\x00\x00\x00 
\x00\x00\x00k\x00\x00\x00o\x00\x00\x00D\x01\x00\x00c\x00\x00\x00u\x00\x00\x00'

[toc] | [prev] | [standalone]


Back to top | Article view | pl.comp.programming


csiph-web