2011-08-10 6 views
11

Chciałbym skonfigurować moją konsolę w systemie Windows XP, aby obsługiwała UTF8 i aby Python mógł to wykryć i pracować z nią.Uzyskiwanie python do drukowania w UTF8 na Windows XP z konsolą

dotąd moje próby:

C:\Documents and Settings\Philippe>C:\Python25\python.exe 
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print u'é' 
é 
>>> import sys 
>>> sys.stdout.encoding 
'cp437' 
>>> quit() 

Więc domyślnie Jestem w 437, i python wykryje, że po prostu w porządku.

C:\Documents and Settings\Philippe>chcp 65001 
Active code page: 65001 

C:\Documents and Settings\Philippe>python 
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.stdout.encoding 
'cp65001' 
>>> print u'é' 
C:\Documents and Settings\Philippe> 

Wydaje się, że drukowanie w UTF8 sprawia Pythona katastrofę teraz ...

+0

Co robi uważasz wydrukować utf8 tutaj w pierwszej kolejności? –

+0

Właśnie zaktualizowałem swoją odpowiedź - dodano ją w Pythonie 3.3. –

+0

Zobacz też: http://stackoverflow.com/a/30505612/788700 – Adobe

Odpowiedz

8

I would like to configure my console on Windows XP to support UTF8

Nie sądzę, że to się wydarzy.

Strona kodowa 65001 jest błędna; niektóre wywołania stdio zachowują się niepoprawnie i łamią wiele narzędzi. Chociaż można zarejestrować cp65001 jako kodowanie ręcznie:

def cp65001(name): 
    if name.lower()=='cp65001': 
     return codecs.lookup('utf-8') 

codecs.register(cp65001) 

a to pozwala na print u'some unicode string', że nie pozwala na pisanie znaków spoza ASCII w tym ciąg Unicode. Otrzymujesz te same nieparzyste błędy (IOError 0 i inne), które robisz, gdy próbujesz pisać sekwencje UTF-8 inne niż ASCII bezpośrednio jako ciągi bajtów.

Niestety UTF-8 jest obywatelem drugiej kategorii w systemie Windows. Model NT Unicode został opracowany zanim UTF-8 istniał, w związku z czym oczekuje się, że użyjesz dwubajtowych kodowań jednostek jednostkowych (UTF-16, pierwotnie UCS-2) w dowolnym miejscu, w którym chcesz uzyskać spójny kod Unicode. Używanie ciągów bajtów, podobnie jak wiele przenośnych aplikacji i języków (takich jak Python) napisanych przy użyciu C-stdio, nie pasuje do tego modelu.

I przepisanie Pythona do korzystania z wywołań konsoli systemu Windows Unicode (takich jak WriteConsoleW) zamiast przenośnych Cddio nie działa dobrze z trikami powłoki, takimi jak orurowanie i przekierowywanie do pliku. (Nie wspominając już o tym, że nadal musisz zmienić domyślną czcionkę terminala na TTF, zanim wyniki będą widoczne w ogóle ...)

Ostatecznie, jeśli potrzebujesz linii poleceń z działającą obsługą UTF-8 dla aplikacje oparte na stdio, prawdopodobnie lepiej byłoby użyć alternatywy dla konsoli Windows, która celowo ją obsługuje, na przykład Cygwin's, Python's IDLE lub PythonWin pywin32.

+0

OK, wtedy lepiej nauczę się pracować z cp437, a następnie ... –

4

Kiedy próbuję to samo na Pythonie 2.7 pojawia się błąd na import sys:

LookupError: unknown encoding: cp65001

Oznacza to, aby mnie, że Python nie wie, jak pracować ze specjalną stroną kodową Windows UTF-8, a 2.5 poradził sobie z sytuacją niezłomnie.

Widocznie ten został zbadany i nie stałe w Pythonie 3.2: http://bugs.python.org/issue6058

Aktualizacja: W What's New In Python 3.3 wymienia ona cp65001 wsparcia jako nowej funkcji.

+0

Nie, Python 3.2 wywala się dla mnie, gdy 'chcp 65001' jest aktywny. Ten konkretny problem został zamknięty jako nieważny, a nie naprawiony. –

+0

@ Mark Token, dzięki za aktualizację. Oczywiście moje umiejętności czytania ze zrozumieniem wymagają poprawy. –

0

Wystąpiły problemy z wyświetlaniem symbolu euro na konsoli cmd ze skryptu w języku Python przy użyciu systemu Windows Vista. Oto, co zadziałało:

Pięść, muszę się upewnić, że czcionka jest ustawiona jako Lucinda Console, a nie czcionki rastrowe, które nie działają.Można to zrobić, ustawiając domyślne właściwości konsoli w rozwijanym menu okna konsoli i ponownie uruchamiając okno konsoli za pomocą cmd.exe.

Po drugie, kiedy uruchamiam cmd, ustaw stronę kodową na chcp 1252.

Po trzecie, upewniam się, że mój edytor (Notepad ++) ma odpowiednie ustawienia kodowania. Z rozwijanego menu Encoding w Notatniku ++ wybierz Encode in UTF-8.

To zadziałało dla mnie.

0

zestaw ten w swojej wygranej:

set PYTHONIOENCODING=utf-8 
Powiązane problemy