سؤال

عند محاولة طباعة سلسلة Unicode في ويندوز وحدة التحكم, أحصل على UnicodeEncodeError: 'charmap' codec can't encode character .... خطأ.أفترض أن هذا هو لأن ويندوز وحدة لا تقبل أحرف Unicode فقط.ما هي أفضل طريقة للتغلب على هذا ؟ هل هناك أي طريقة يمكن أن تجعل الثعبان تلقائيا طباعة ? بدلا من الفشل في هذه الحالة ؟

تحرير: أنا باستخدام بايثون 2.5.


ملاحظة: @LasseV.Karlsen الإجابة مع علامة الاختيار هو نوع من عفا عليها الزمن (من عام 2008).الرجاء استخدام حلول/الإجابات/الاقتراحات أدناه مع الرعاية!!

@JFSebastian الإجابة هو أكثر أهمية من اليوم (6 يناير 2016).

هل كانت مفيدة؟

المحلول

ملاحظة: هذا الجواب هو نوع من عفا عليها الزمن (من عام 2008).الرجاء استخدام الحل أدناه مع الرعاية!!


هنا صفحة تفاصيل المشكلة والحل (البحث في الصفحة عن النص التفاف sys.stdout في مثيل):

PrintFails - الثعبان ويكي

هنا مدونة مقتطفات من هذه الصفحة:

$ 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
  Б
  Б

هناك بعض مزيد من المعلومات على صفحة تستحق القراءة.

نصائح أخرى

تحديث: بيثون 3.6 تنفذ بيب 528:تغيير ويندوز وحدة الترميز إلى UTF-8: الافتراضي تحكم على ويندوز الآن قبول جميع أحرف Unicode. داخليا ، فإنه يستخدم نفس Unicode API كما على win-unicode-console الحزمة المذكورة أدناه. print(unicode_string) يجب أن تعمل فقط الآن.


أحصل على UnicodeEncodeError: 'charmap' codec can't encode character... خطأ.

الخطأ يعني أن أحرف Unicode الذي تحاول الطباعة لا يمكن أن تكون ممثلة الحالي (chcp) وحدة ترميز الأحرف.مخطط الشفرة غالبا ما تكون 8 بت ترميز مثل cp437 التي يمكن أن تمثل فقط ~0x100 شخصيات من ~1M أحرف Unicode:

>>> u"\N{EURO SIGN}".encode('cp437')
Traceback (most recent call last):
...
UnicodeEncodeError: 'charmap' codec can't encode character '\u20ac' in position 0:
character maps to 

أفترض أن هذا هو لأن ويندوز وحدة لا تقبل أحرف Unicode فقط.ما هي أفضل طريقة للتغلب على هذا ؟

ويندوز وحدة لا تقبل أحرف Unicode و ذلك حتى يمكن عرضها (BMP فقط) إذا المقابلة الخط تكوين. WriteConsoleW() API ينبغي أن تستخدم على النحو المقترح في @الدايرة Hopwood الجواب.يمكن أن يطلق عليه بشفافية أي أنك لا تحتاج إلى أن عدم تعديل البرامج النصية الخاصة بك إذا كنت تستخدم win-unicode-console حزمة:

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

انظر ما هو التعامل مع بايثون 3.4 Unicode لغات مختلفة و ويندوز ؟

هل هناك أي طريقة يمكن أن تجعل الثعبان تلقائيا طباعة ? بدلا من الفشل في هذه الحالة ؟

إذا يكفي ليحل محل كل unencodable الشخصيات مع ? في الحالة الخاصة بك ثم يمكنك تعيين PYTHONIOENCODING envvar:

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

في بيثون 3.6+, الترميز المحدد من قبل PYTHONIOENCODING envvar هو تجاهل التفاعلية وحدة المخازن المؤقتة ما لم PYTHONLEGACYWINDOWSIOENCODING envvar يتم تعيين غير فارغة.

على الرغم من الآخر قبولا السبر الإجابات التي تشير إلى تغيير رمز الصفحة 65001 ، لا يعمل.(أيضا تغيير الترميز الافتراضي باستخدام sys.setdefaultencoding هو ليست فكرة جيدة.)

انظر هذا السؤال لمزيد من التفاصيل البرمجية التي لا تعمل.

إذا كنت لا ترغب في الحصول على موثوقية تمثيل سيء حرف(s) قد تستخدم شيئا مثل هذا (العمل مع بيثون >= 2.6 ، بما في ذلك 3.x):

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}")

السيئة حرف(s) في السلسلة سيتم تحويلها في التمثيل والتي هي قابلة للطباعة من ويندوز التحكم.

رمز أدناه سوف تجعل الثعبان إخراج وحدة التحكم كما UTF-8 حتى على ويندوز.

وحدة سيتم عرض الأحرف بشكل جيد على ويندوز 7 ولكن على ويندوز XP فإنه لن يتم عرض بشكل جيد, ولكن على الأقل و الأكثر أهمية سيكون لديك متسقة الناتج من البرنامج النصي الخاص بك على جميع المنصات.عليك أن تكون قادرا على إعادة توجيه الإخراج إلى ملف.

رمز أدناه تم اختباره مع بيثون 2.6 على ويندوز.


#!/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"

مثل جيامباولو Rodolà الجواب, ولكن حتى أكثر القذرة:أنا حقا تنوي قضاء وقت طويل (قريبا) فهم الموضوع كله من ترميزات و كيفية تطبيقها على Windoze لوحات المفاتيح ،

لحظة أردت فقط sthg مما يعني البرنامج لن تحطم ، والتي فهمت ...و أيضا التي لم تنطوي على استيراد الكثير من الغريبة وحدات (على وجه الخصوص أنا باستخدام Jython ، حتى نصف الوقت بيثون وحدة تبين في الواقع أن تكون متاحة).

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

NB "العلاقات العامة" هو أقصر إلى نوع من "طباعة" (وقليلا جدا أقصر إلى نوع من "safeprint")...!

فقط أدخل هذا الرمز في سطر الأوامر قبل تنفيذ بيثون السيناريو:

chcp 65001 & set PYTHONIOENCODING=utf-8

بايثون 2 محاولة:

print unicode(string, 'unicode-escape')

لبيثون 3 محاولة:

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

أو محاولة الفوز unicode-وحدة التحكم:

pip install win-unicode-console
py -mrun your_script.py

سبب المشكلة هو لا الفوز التحكم ليس على استعداد لقبول Unicode (كما يفعل هذا منذ أظن Win2k بشكل افتراضي).هو النظام الافتراضي الترميز.جرب هذا الكود الذي يمنحك:

import sys
sys.getdefaultencoding()

إذا كان يقول ascii هناك سبب ;-) يجب عليك إنشاء ملف يسمى sitecustomize.py ووضعها تحت الثعبان المسار (وضعه تحت /usr/lib/python2.5/site-packages, ولكن هذا هو مختلفا على الفوز - هو c:\python\lib\site-packages أو شيء) ، مع محتويات التالية:

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

وربما كنت قد ترغب في تحديد الترميز في الملفات الخاصة بك وكذلك:

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

تحرير:مزيد من المعلومات يمكن العثور عليها في الممتاز الغوص في بيثون الكتاب

TL;DR:

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

ركضت إلى نفسي ، والعمل على نشل الدردشة (IRC) بوت.(بايثون 2.7 أحدث)

أردت أن تحليل رسائل الدردشة من أجل الاستجابة...

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

ولكن أيضا طباعتها بأمان إلى وحدة التحكم في الإنسان-تنسيق قابل للقراءة:

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

هذا تصحيح مسألة رمي بوت UnicodeEncodeError: 'charmap' أخطاء استبدال أحرف unicode مع ?.

نوع من الصلة على الإجابة من قبل J.F.سيباستيان ، ولكن أكثر مباشرة.

إذا كنت تواجه هذه المشكلة عند الطباعة إلى وحدة التحكم/المحطة الطرفية, ثم القيام بذلك:

>set PYTHONIOENCODING=UTF-8

بيثون 3.6 windows7:هناك العديد من الطريق لإطلاق بيثون يمكن استخدام بيثون وحدة التحكم (التي لديها الثعبان شعار على ذلك) أو windows وحدة التحكم (إنه مكتوب cmd.exe على ذلك).

أنا لا يمكن أن طباعة utf8 الشخصيات في ويندوز التحكم.الطباعة utf-8 أحرف رمي لي هذا الخطأ:

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 

بعد محاولة والفشل في فهم الجواب أعلاه اكتشفت انها كانت مجرد تحديد المشكلة.انقر بزر الماوس الأيمن على الجزء العلوي من وحدة التحكم cmd ويندوز على علامة التبويب font اختار lucida console.

جيمس Sulak طلب ،

هل هناك أي طريقة يمكن أن تجعل الثعبان طباعة تلقائيا ؟ بدلا من الفشل في هذه الحالة ؟

حلول أخرى يوصي علينا أن نحاول تعديل بيئة ويندوز أو استبدال بايثون print() وظيفة.الجواب أدناه يأتي أقرب إلى الوفاء Sulak طلب.

تحت ويندوز 7 ، بيثون 3.5 يمكن طباعة Unicode دون رمي UnicodeEncodeError على النحو التالي:

في مكان:print(text)
البديل: print(str(text).encode('utf-8'))

بدلا من رمي استثناء ، بيثون يعرض الآن ليست للطباعة أحرف Unicode كما \xNN رموز عرافة ، على سبيل المثال:

  Halmalo n\xe2\x80\x99\xc3\xa9tait بالإضافة إلى qu\xe2\x80\x99un بوينت نوير

بدلا من

  Halmalo ن'était بالإضافة إلى تشو تشون بوينت نوير

منح هذا الأخير هو الأفضل ceteris paribus, لكن وإلا السابق تماما دقة التشخيص الرسائل.لأنه يعرض Unicode كما الحرفي بايت القيم السابقة قد يساعد أيضا في تشخيص ترميز/فك المشاكل.

ملاحظة: على str() دعوة أعلاه هو مطلوب لأن خلاف ذلك encode() أسباب الثعبان رفض حرف Unicode كما tuple من الأرقام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top