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
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
>
> 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
> czegos nie rozumiem, przeciez on to kodowanie podal jako latin2
pomieszalem kodowanie wyjscia z kodowaniem stringa.