Skocz do zawartości

[python 2.5] non-ascii characters / przekierowanie stdout


ktoś

Polecane posty

Nie znając pytona udało mi się w bólach zkodzić coś, co pozwala na grzebanie w htmlu. Ok, niby wszystko działa, pięknie wyciąga usera, datę, ID postów i ich zawartość z forum phpbb3, drukuje mi na ekranie w postaci pseudoXML. Do tego momentu jest dobrze

I teraz, odpalam skrypt podając mu konieczne dane w parametrach, a stdout przekierowuję poza ekran: do pliku albo do innego programu - nie ma znaczenia. W obu przypadkach dochodzi do pierwszej polskiej litery "ł" i wywala Ascii Encoding Error

Pomijając, że python nie powinien zastanawiać się nad tym, co ja zrobię z wyjściem, a tym bardziej nie powinno go to obchodzić, jak to można obejść?

Dowiedziałem się już, że python przechowuje wszystkie teksty w UTF-8. Moja konsola również używa UTF-8. A więc jak wyjście jest wycelowane w konsolę, to działa. Ale nie wiedzieć czemu, cokolwiek bym nie zrobił z wyjściem, python to sprawdza i próbuje mi automatycznie konwertować na ASCII.

Da się to jakoś zablokować?

Jak to było ładnie powiedziane: nie waże w jakiej postaci będą wyniki, o ile tylko to będzie spójne. A więc mam spójne wyniki, tylko jeszcze muszę je jakoś zapisać, a ręczne przeklejanie 15000 postów mi się nie uśmiecha.

 

Próbowałem też metod z zapisywaniem do pliku zamiast drukowania, oraz z podstawieniem uchwytu do pliku zamiast stdout wewnątrz skryptu, też nie działa. Trafiłem na info o czymś w stylu setappencoding oraz setdefaultencoding, ale sys nie ma takich metod.

Dodanie linii kodowania na początku pliku też nie daje efektów. Próbowałem utf8 oraz latin2 ( iso cośtam)

 

aha, może taki test: jakie wyniku dają u Was polecenia

 

echo "import sys

print sys.stdout.encoding

" | python

 

oraz

 

echo "import sys

print sys.stdout.encoding

" | python | cat

 

u mnie pierwsze daje utf8, a drugie "None"

Link do komentarza
Udostępnij na innych stronach

Tak, te kody które wrzuciłem robią dokładnie to samo co ./skrypt > plik.txt

Właśnie m.in. takie przekierowanie wywala się na pierwszym polskim znaku

 

To o kodowaniu w pythonie poczytam - dzięki Ci za to :)

pokombinuję jeszcze trochę... próbowałem nawet zbindować terminal z plikiem, ale to też nie bardzo działa. Do pliku nic się nie zapisuje

Link do komentarza
Udostępnij na innych stronach

Well, well, well...

W końcu udało mi się dotrzeć do rozwiązania. Rozwiazanie jest wkurwiająco banalne, a jednocześnie równie wkurwiająco nie do odgadnięcia...

 

Otóż: bardzo często pojawia się informacja, że trzeba wpisać sys.setdefaultencoding("")

A więc oczywiste jest, że trzeba wpisać:

KOD

import sys

sys.setdefaultencoding("utf-8")

I w tym momencie python wywala error, że sys nie ma metody setdefaultencoding. Dziwne... Innym działa.

I teraz najbardziej wkurwiający motyw: Linijka, o której informacje ciężko znaleść, a jej zastosowanie jest zarówno konieczne jak i nielogiczne:

KODreload(sys)

Poprawny kod wygląda więc tak:

KOD

import sys

reload(sys)

sys.setdefaultencoding("utf-8")

 

Dowiedziałem się, że nie lubię pythona, bo jest zbyt windowsowy. Próbuje być mądrzejszy ode mnie, a przecież chyba lepiej wiem co chcę zrobić, nie?

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...