Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Problem z kodowaniem przy przekierowaniu STDOUT

7 views
Skip to first unread message

danher

unread,
May 11, 2008, 3:54:01 PM5/11/08
to
Witam!

Na początek kod:
#v+
#!/usr/bin/python
#encoding=iso-8859-2

if __name__ == '__main__':
test = 'ąłóż'
test_uni = unicode(test,"latin2")
print test_uni
#v-

Przy uruchomieniu "standardowym" wszystko w porządku:
#v+
~$ ./python.py
ąłóż
#v-

Za to kiedy próbuję wyjście przekierować do pliku lub do innego programu przez
rurkę:
#v+
~$ ./python.py > file
Traceback (most recent call last):
File "./python.py", line 7, in ?
print test_uni
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3:
ordinal not in range(128)

~$ ./python.py | cat
Traceback (most recent call last):
File "./python.py", line 7, in ?
print test_uni
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3:
ordinal not in range(128)
#v-

Powłoka to GNU bash, wersja 3.2.17. Pytanie brzmi: dlaczego w momencie, kiedy w
powłoce chcę przekierować wyjście skryptu, to interpreter chce zakodować je w
ASCII? I dlaczego w ogóle obchodzi go to, co się dzieje z tym wyjściem? :)

--
Daniel Hernik

Rob Wolfe

unread,
May 11, 2008, 4:15:05 PM5/11/08
to
danher <dan...@gazeta.pl> writes:

Gdy piszesz na standardowe wyjście, to interpreter jest na tyle uprzejmy,
że odgaduje kodowanie na podstawie ustawień terminala.
W przypadku przekierowania nie ma żadnej informacji na temat docelowego
kodowania (nie ma sposobu odgadnięcia jakiego kodowania używa plik,
do którego przekierowujesz) i Python nie próbuje zgadywać.
Przy zapisie do pliku kodowanie należy podawać explicit:
python -c "print u'\u03A9'.encode('utf-8')" > file.txt

Gdy bardzo chcesz używać przekierowań, to możesz się posiłkować
takim trikiem:
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

Wówczas wyjście będzie zawsze kodowane w 'utf-8'.

RW

Sulsa

unread,
May 12, 2008, 6:26:53 AM5/12/08
to
On Sun, 11 May 2008 22:15:05 +0200
Rob Wolfe <r...@smsnet.pl> wrote:

>
> Gdy piszesz na standardowe wyjście, to interpreter jest na tyle uprzejmy,
> że odgaduje kodowanie na podstawie ustawień terminala.
> W przypadku przekierowania nie ma żadnej informacji na temat docelowego
> kodowania (nie ma sposobu odgadnięcia jakiego kodowania używa plik,
> do którego przekierowujesz) i Python nie próbuje zgadywać.
> Przy zapisie do pliku kodowanie należy podawać explicit:
> python -c "print u'\u03A9'.encode('utf-8')" > file.txt
>

czegos nie rozumiem, przeciez on to kodowanie podal jako latin2

Sulsa

unread,
May 12, 2008, 6:30:50 AM5/12/08
to
On Mon, 12 May 2008 12:26:53 +0200
Sulsa <su...@dontmail.me> wrote:

> czegos nie rozumiem, przeciez on to kodowanie podal jako latin2

pomieszalem kodowanie wyjscia z kodowaniem stringa.

0 new messages