danher <dan
...@gazeta.pl> writes:
> 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? :)
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