2012-11-19 22 views
11

Windows 8'de CMD'deyim ve kod sayfasını 65001 (chcp 65001) olarak ayarlıyorum. Python 2.7.2 (ActivePython 2.7.2.5) kullanıyorum ve PYTHONSTARTUP ortam değişkenini "bootstrap.py" ye ayarlıyorum.Unicode'u CMD'ye yazarken neden IOError'ları alıyorum? (Kod sayfası 65001 ile)

bootstrap.py: Bu bana baskı ASCII sağlar

import codecs 
codecs.register(
    lambda name: name == 'cp65001' and codecs.lookup('UTF-8') or None 
) 

:

>>> print 'hello' 
hello 
>>> print u'hello' 
hello 

Ama ASCII olmayan karakterler içeren bir Unicode dizesi yazdırmaya çalıştığımda olsun hataları hayır yapar bana hisset. Eğer her zaman bir hata zam yok (ve hatta yükseltmek değil Gördüğünüz gibi

>>> print u'æøå' 
��øåTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 2] No such file or directory 

>>> print u'åndalsnes' 
��ndalsnes 

>>> print u'åndalsnesæ' 
��ndalsnesæTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 22] Invalid argument 

>>> print u'Øst' 
��st 

>>> print u'uØst' 
uØstTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 22] Invalid argument 

>>> print u'ØstÆØÅæøå' 
��stÆØÅæøåTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 22] Invalid argument 

>>> print u'_ØstÆØÅæøå' 
_ØstÆØÅæøåTraceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: [Errno 22] Invalid argument 

: İşte İskandinav sembolleri içeren birkaç dizeleri yazdırmak için deneyin (Ben okunabilmesi için baskılar arasında fazladan satır sonu eklendi) her seferinde aynı hata) ve İskandinav sembolleri sadece bazen doğru şekilde görüntülenir.

Birisi bu davranışı açıklayabilir mi, yoksa en azından Unicode'un CMD'ye nasıl yazdırılacağını bulmama yardımcı olabilir mi?

+2

Bu bir kabus durumudur. Ve burada SO ve başka yerlerde bir gazilyon kez tartışıldı. Örneğin: http://www.google.com/search?q=print+unicode+windows+console+python –

+0

Yapabilecekleriniz varsa, en basit çözüm Python 3,3'ü kullanmaktır. Bu bir [cp65001 codec] 'dir (http://docs.python.org/3/whatsnew/3.3.html#codecs). – eryksun

+0

@PiotrDobrogost: Eğer bulamıyorsanız lütfen bana başka bir davayla bakın (ve ** ** Unicode kod çözme hataları anlamına gelmez!) – Hubro

cevap

1

Bu deneyin: __future__ ithalat unicode_literals gelen ait

# -*- coding: utf-8 -*- 
    from __future__ import unicode_literals 
    print u'æøå' 

yapma kullanımınıinteraktif piton oturumu yararlı olacaktır.

başarıyla WriteConsoleW kullanılarak konsola için Unicode yazmak için kesinlikle mümkündür. Bu, 65001 dahil olmak üzere konsol kodu sayfasından bağımsız olarak çalışır. here kodu öyle yapar (Python 2.x için, ancak yine de WriteConsoleW'yi C'den çağırırsınız).

WriteConsoleW, bildiğim bir hataya sahip, bu da fails when writing more than 26608 characters at once. Tek bir aramada aktarılan veri miktarını sınırlandırarak çalışmak kolaydır.

Yazı tipleri Python'un sorunu değil, kodlamadır. Bazı karakterler, bu karakterleri görüntüleyebilecek yazı tiplerini seçmemiş olabileceğinden, doğru karakterlerin çıktısını almamak mantıklı değildir. Bu hata yeniden açılmalıdır.

(Tamlık için, konsoldaki Unicode'u Lucida Console ve Consolas dışındaki yazı tiplerini kullanarak görüntülemek mümkündür, ancak requires a registry hack.) Umarım yardımcı olur.

+0

WriteConsoleW'un UCS-2 ile sınırlı olduğuna inanıyorum, yani, ek düzlemlerdeki karakterleri kullanamazsınız. Ancak çoğu durumda bu bir problem olmamalı. –

İlgili konular