Python, Unicode ve Windows konsol

oy
104

Bir Windows konsolunda bir Unicode dize yazdırmak için çalıştığımda, bir olsun UnicodeEncodeError: 'charmap' codec can't encode character ....hatası. Windows konsol yalnızca Unicode karakterleri kabul etmez çünkü bu olduğunu varsayalım. Bu çevrede en iyi yolu nedir? Ben Python otomatik olarak yazdırmak getirmenin herhangi bir yolu var mı ?bunun yerine bu durumda başarısız?

Düzenleme: Ben Python 2.5 kullanıyorum.


Not: onay işareti ile LasseV.Karlsen cevap (2008'den itibaren) çeşit modası geçmiş @. Dikkatle aşağıda çözümler / cevapları / öneri kullanın !!

@JFSebastian cevap bugün (6 Ocak 2016) itibariyle daha alakalıdır.

Oluştur 07/08/2008 saat 21:26
kaynak kullanıcı
Diğer dillerde...                            


13 cevaplar

oy
29

Not: Bu cevap (2008'den itibaren) çeşit eski. Dikkatle çözüm aşağıda kullanın !!


Burada sorunu ve bir çözüm (metin için sayfa arama detayı sayfası örneğini içine sarma sys.stdout ):

PrintFails - Python Wiki

İşte o sayfadan bir kod alıntı:

$ python -c 'import sys, codecs, locale; print sys.stdout.encoding; \
    sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout); \
    line = u"\u0411\n"; print type(line), len(line); \
    sys.stdout.write(line); print line'
  UTF-8
  <type 'unicode'> 2
  Б
  Б

  $ python -c 'import sys, codecs, locale; print sys.stdout.encoding; \
    sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout); \
    line = u"\u0411\n"; print type(line), len(line); \
    sys.stdout.write(line); print line' | cat
  None
  <type 'unicode'> 2
  Б
  Б

salt değer o sayfadaki biraz daha bilgi var.

Cevap 07/08/2008 saat 21:32
kaynak kullanıcı

oy
1

Sorunun nedeni DEĞİL Win konsol (ı varsayılan olarak WIN2k tahmin beri bu yaptığı gibi) Unicode kabul etmeye istekli değil. Bu varsayılan sistem kodlama. Bu kodu deneyin ve size senkronizasyon görmek:

import sys
sys.getdefaultencoding()

o ASCII derse, orada mısın sitecustomize.py adlı bir dosya oluşturmak ve ben /usr/lib/python2.5/site-packages altına yerleştirin (piton yolunun altına koymak zorunda sebebiniz ;-), ama bu konuda farklı bir şekilde edilir Win - bu c: \ piton \ lib \ aşağıdaki içeriği ile site paketleri veya şey),:

import sys
sys.setdefaultencoding('utf-8')

ve belki siz de dosyalarında kodlamayı belirtmek yerinde olur:

# -*- coding: UTF-8 -*-
import sys,time

Düzenleme: Daha fazla bilgi bulunabilir mükemmel Python kitap haline Dive

Cevap 11/08/2008 saat 16:58
kaynak kullanıcı

oy
9

Aşağıdaki kod Python çıkış UTF-8 hatta Windows üzerinde olarak teselli etmeye yapacaktır.

Konsol iyi Windows 7 üzerinde ama iyi bunları göstermez Windows XP üzerinde karakter gösterecektir, ama en azından çalışacak ve en önemlisi tüm platformlarda Betiğiniz tutarlı çıkışı olacaktır. Bir dosyaya çıktı yönlendirmek mümkün olacak.

Kodun altında Windows üzerinde Python 2.6 ile test edilmiştir.


#!/usr/bin/python
# -*- coding: UTF-8 -*-

import codecs, sys

reload(sys)
sys.setdefaultencoding('utf-8')

print sys.getdefaultencoding()

if sys.platform == 'win32':
    try:
        import win32console 
    except:
        print "Python Win32 Extensions module is required.\n You can download it from https://sourceforge.net/projects/pywin32/ (x86 and x64 builds are available)\n"
        exit(-1)
    # win32console implementation  of SetConsoleCP does not return a value
    # CP_UTF8 = 65001
    win32console.SetConsoleCP(65001)
    if (win32console.GetConsoleCP() != 65001):
        raise Exception ("Cannot set console codepage to 65001 (UTF-8)")
    win32console.SetConsoleOutputCP(65001)
    if (win32console.GetConsoleOutputCP() != 65001):
        raise Exception ("Cannot set console output codepage to 65001 (UTF-8)")

#import sys, codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

print "This is an Е乂αmp١ȅ testing Unicode support using Arabic, Latin, Cyrillic, Greek, Hebrew and CJK code points.\n"
Cevap 06/01/2010 saat 12:38
kaynak kullanıcı

oy
22

65001 kod sayfasını değiştirmenizi öneriyoruz diğer akla yakın sondaj cevapları rağmen, o işe yaramaz . (Ayrıca, kullanarak varsayılan kodlamayı değişiyor sys.setdefaultencodingolan iyi bir fikir değildir .)

Bkz bu soruyu detayları ve çalışır kodu.

Cevap 09/01/2011 saat 04:07
kaynak kullanıcı

oy
11

Kötü karakter (ler) Böyle bir şey kullanıyor olabilir güvenilir bir temsilini edinmek isteyen değilseniz (3.x dahil piton> = 2.6 ile çalışan):

from __future__ import print_function
import sys

def safeprint(s):
    try:
        print(s)
    except UnicodeEncodeError:
        if sys.version_info >= (3,):
            print(s.encode('utf8').decode(sys.stdout.encoding))
        else:
            print(s.encode('utf8'))

safeprint(u"\N{EM DASH}")

dizesinde kötü karakter (ler), Windows konsol tarafından basılabilir bir temsilinde dönüştürülecektir.

Cevap 19/05/2012 saat 17:48
kaynak kullanıcı

oy
50

Güncelleme: Python 3.6 uygulayan UTF-8'e değiştir, Windows konsol kodlama: PEP 528 : Windows varsayılan konsolu şimdi tüm Unicode karakterleri kabul eder. Dahili olarak, bu aynı Unicode API kullanan aşağıda belirtilen paketin . Sadece şimdi çalışmalıdır.win-unicode-consoleprint(unicode_string)


Ben olsun UnicodeEncodeError: 'charmap' codec can't encode character... hatası.

Hata yazdırmak çalıştığınız Unicode karakterler akımı (kullanılarak temsil edilemez anlamına gelir chcp) konsol karakter kodlamasını. Kod sayfası genellikle 8-bit şifreleme gibi cp437bu ~ 1M Unicode karakterleri sadece ~ 0x100 karakterlerini temsil edebilir:

>>> U "\ K {EURO SIGN}". ( 'Cp437') kodlayan
Traceback (en son çağrı son):
...
UnicodeEncodeError: 0 konumunda '\ u20AC' karakterini kodlamak olamaz 'charmap' codec'i:
karakter eşleştiren 

Windows konsol yalnızca Unicode karakterleri kabul etmez çünkü bu olduğunu varsayalım. Bu çevrede en iyi yolu nedir?

Windows konsol Unicode karakterleri kabul etmez ve hatta (BMP için) bunları görüntüleyebilir karşılık gelen yazı yapılandırılmışsa . WriteConsoleW()Önerildiği üzere API kullanılmalıdır @Daira Hopwood cevabı . Yani sen gerekmez ve kullanmak eğer komut değiştirmemelisiniz şeffaf çağrılabilir win-unicode-consolepaketi :

T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py

Bkz Python 3.4, Unicode, farklı dil ve Windows ile anlaşma nedir?

Ben Python otomatik olarak yazdırmak getirmenin herhangi bir yolu var mı ?bunun yerine bu durumda başarısız?

O bütün unencodable karakterleri değiştirmek için yeterliyse ?sizin durumda o zaman ayarlayabilirsiniz PYTHONIOENCODINGenvvar :

T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]

Python 3.6+ yılında belirlediği kodlama PYTHONIOENCODINGsürece envvar interaktif konsol tamponları için göz ardı edilir PYTHONLEGACYWINDOWSIOENCODINGenvvar boş olmayan bir dizeye ayarlanır.

Cevap 24/08/2015 saat 06:35
kaynak kullanıcı

oy
1

Tıpkı JF Sebastian tarafından yanıta ilişkin, ancak daha doğrudan.

Konsol / terminal yazdırırken bu sorunu yaşıyorsanız, o zaman bunu:

>set PYTHONIOENCODING=UTF-8
Cevap 16/12/2015 saat 05:53
kaynak kullanıcı

oy
2

Giampaolo Rodolà cevabı gibi, ama daha da kirli: Gerçekten, gerçekten kodlamaların bütün konuyu anlamak (yakında) uzun bir zaman harcamak niyetinde ve onlar konsolları Windows'un nasıl uygulanacağı,

Şu an için sadece ben, özellikle ben Jython kullanıyorum (çok fazla egzotik modülleri ithal ve yarı zamanlı bir Python dahil etmedi ki de anlaşılmış ... ve programı anlamına gelecektir ki Sthg ÇÖKÜYOR ETMEM istedik ve hangi modül) kullanılabilir olması aslında değil çıkıyor.

def pr(s):
    try:
        print(s)
    except UnicodeEncodeError:
        for c in s:
            try:
                print( c, end='')
            except UnicodeEncodeError:
                print( '?', end='')

NB "pr" "baskı" yazmaktan daha kolaydır kısadır (ve daha kısa biraz "safeprint" yazmaktan daha kolaydır) ...!

Cevap 09/03/2016 saat 20:14
kaynak kullanıcı

oy
0

James Sulak sordu

Ben Python otomatik olarak yazdırmak getirmenin herhangi bir yolu var mı? Bunun yerine bu durumda başarısız?

Diğer çözümler biz, Windows ortamını değiştirmek veya Python'un değiştirmeye teşebbüs tavsiye print()işlevi. Cevap aşağıdakilerden Sulak isteğini yerine getirirken daha yakın geliyor.

Windows 7 altında Python 3.5 bir atma olmadan Unicode yazdırmak için yapılabilir UnicodeEncodeErrorşöyle:

    : Yerine     print(text)
    yerine:     print(str(text).encode('utf-8'))

Bunun yerine bir istisna atma, Python şimdi basılamaz Unicode karakterleri görüntüler \ XNN örneğin altıgen kodları,:

  Halmalo n \ XE2 \ x80 \ x99 \ XC3 \ xa9tait artı qu \ XE2 \ x80 \ x99un noktası kara

Yerine

  Halmalo n'était artı qu'un noktası noir

Verilen, ikincisi tercih edilir diğer şartlar sabitken , ama aksi eski tanısal mesajlar için tamamen doğrudur. Literal bayt değerleri gibi Unicode görüntüler Çünkü eski zamanda şifreleme / şifre çözme problemlerinin teşhisinde yardımcı olabilir.

Not:str() Aksi çünkü çağrı yukarıda gereklidir encode()Python bir demet olarak Unicode karakter reddetmek neden olur.

Cevap 14/05/2016 saat 16:47
kaynak kullanıcı

oy
1

Python 3.6 windows7: (üzerinde bir piton logosu vardır) piton konsolu veya pencere konsolu (bunun üzerine cmd.exe'yi yazıyor) kullanabileceği bir piton başlatmak için birkaç yol yoktur.

Ben pencereleri konsolunda utf8 karakterleri yazdıramadı. utf-8 karakterleri yazdırma bana bu hatayı atmak:

OSError: [winError 87] The paraneter is incorrect 
Exception ignored in: (_io-TextIOwrapper name='(stdout)' mode='w' ' encoding='utf8') 
OSError: [WinError 87] The parameter is incorrect 

Çalışıyor ve bunu sadece bir ayar sorunu olduğunu keşfetti yukarıdaki cevabı anlamak için başarısız sonra. Sağ cmd konsol pencerelerin üstünde tıklayıp, sekmede fontlucida'yı konsolu seçti.

Cevap 11/05/2017 saat 19:08
kaynak kullanıcı

oy
2

Python 2 denemede İçin:

print unicode(string, 'unicode-escape')

Python 3 denemede İçin:

import os
string = "002 Could've Would've Should've"
os.system('echo ' + string)

Veya kazan-unicode-konsolu deneyin:

pip install win-unicode-console
py -mrun your_script.py
Cevap 24/08/2017 saat 17:00
kaynak kullanıcı

oy
1

TL; DR:

print(yourstring.encode('ascii','replace'));

Bir -Twitch sohbet (IRC) bot üzerinde çalışan, bu işe kendimi koştum. (Python 2.7 son)

Ben cevap vermek amacıyla sohbet iletileri ayrıştırmak istedi ...

msg = s.recv(1024).decode("utf-8")

ama aynı zamanda bir insan tarafından okunabilir formatta konsola güvenli bir şekilde yazdırın:

print(msg.encode('ascii','replace'));

Bu bot atma sorunu giderilmiştir UnicodeEncodeError: 'charmap'hatalar ile unicode karakterleri yerini ?.

Cevap 01/07/2018 saat 14:52
kaynak kullanıcı

oy
3

Sadece python komut çalıştırmadan önce komut satırında şu kodu girin:

chcp 65001 & set PYTHONIOENCODING=utf-8
Cevap 02/10/2018 saat 21:11
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more