164

Windows コンソールで Unicode 文字列を出力しようとすると、エラーが発生します。

UnicodeEncodeError: 'charmap' codec can't encode character ....

これは、Windows コンソールが Unicode のみの文字を受け入れないためだと思います。これを回避する最善の方法は何ですか? ?この状況で失敗する代わりに、Python に a を自動的に出力させる方法はありますか?

編集: Python 2.5 を使用しています。


注:チェックマークが付いた@LasseV.Karlsenの回答は、時代遅れです(2008年以降)。以下の解決策/回答/提案を慎重に使用してください!!

@JFSebastianの回答は、今日(2016年1月6日)の時点でより関連性があります。

4

14 に答える 14

40

注:この回答は時代遅れです(2008年以降)。以下のソリューションは注意して使用してください!!


問題と解決策の詳細が記載されたページを次に示します (このページでテキストWrapping sys.stdout into an instanceを検索してください)。

PrintFails - Python Wiki

そのページからのコードの抜粋は次のとおりです。

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

そのページにはさらに詳しい情報があり、読む価値があります。

于 2008-08-07T22:32:23.510 に答える
30

コードページを65001に変更することを提案する他のもっともらしい答えにもかかわらず、それは機能しません。(また、を使用してデフォルトのエンコーディングを変更することsys.setdefaultencodingお勧めできません。)

動作する詳細とコードについては、この質問を参照してください。

于 2011-01-09T05:07:56.410 に答える
12

If you're not interested in getting a reliable representation of the bad character(s) you might use something like this (working with python >= 2.6, including 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}")

The bad character(s) in the string will be converted in a representation which is printable by the Windows console.

于 2012-05-19T18:48:28.440 に答える
10

以下のコードは、Windows でも Python 出力を UTF-8 としてコンソールに出力します。

コンソールは、Windows 7 では文字を適切に表示しますが、Windows XP では適切に表示しませんが、少なくとも機能し、すべてのプラットフォームでスクリプトから一貫した出力が得られることが最も重要です。出力をファイルにリダイレクトできます。

以下のコードは、Windows 上の Python 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"
于 2010-01-06T13:38:39.843 に答える
6

Giampaolo Rodolàの答えのように、しかしさらに汚い:私は本当に、エンコーディングの主題全体とそれらがWindozeコンソールにどのように適用されるかを理解するのに本当に長い時間を費やすつもりです.

今のところ、プログラムがクラッシュしないことを意味する sthg が欲しかっただけで、理解できました...そして、あまりにも多くのエキゾチックなモジュールをインポートする必要もありませんでした (特に、私は Jython を使用しているため、半分の時間は Pythonモジュールは実際には利用できないことがわかります)。

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

注意: "pr" は "print" よりもタイプするほうが短い (そして "safeprint" よりもタイプするほうがかなり短い)...!

于 2016-03-09T22:14:15.093 に答える
3

JF Sebastian の回答に関連していますが、より直接的です。

コンソール/ターミナルに印刷するときにこの問題が発生した場合は、次のようにします。

>set PYTHONIOENCODING=UTF-8
于 2015-12-16T07:53:43.617 に答える
2

問題の原因は、WinコンソールがUnicodeを受け入れようとしないことではありません(デフォルトではWin2kを推測しているため、これを受け入れます)。これはデフォルトのシステムエンコーディングです。このコードを試して、何が得られるかを確認してください。

import sys
sys.getdefaultencoding()

asciiと表示されている場合は、原因があります;-) sitecustomize.pyというファイルを作成し、Pythonパスの下に配置する必要があります(/usr/lib/python2.5/site-packagesの下に配置しますが、これは異なります) Win-これはc:\ python \ lib \ site-packagesなど)で、次の内容が含まれています。

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

また、ファイルでエンコーディングを指定することもできます。

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

編集:詳細については、優れたDiveintoPythonの本を参照してください。

于 2008-08-11T17:58:28.733 に答える
0

ジェームズ・スラックは尋ねた、

Python を自動的に出力させる方法はありますか? この状況で失敗する代わりに?

他の解決策では、Windows 環境を変更するか、Python のprint()機能を置き換えることをお勧めします。以下の回答は、Sulak の要求を満たすことに近づいています。

Windows 7 では、次のように Python 3.5 で a をスローせずに Unicode を出力できUnicodeEncodeErrorます。

    代わりに:    print(text)
    代用:     print(str(text).encode('utf-8'))

Python は、例外をスローする代わりに、印刷できない Unicode 文字を\xNN 16 進コードとして表示するようになりました。

  ハルマロn\xe2\x80\x99\xc3\xa9tait plus qu\xe2\x80\x99un point noir

それ以外の

  ハルマロ ネテ プラス クン ポワン ノワール

確かに、後者はceteris paribusとして望ましいものですが、それ以外の場合は前者が診断メッセージに対して完全に正確です。Unicode をリテラルのバイト値として表示するため、前者はエンコード/デコードの問題の診断にも役立つ場合があります。

注:上記のstr()呼び出しが必要なのは、そうしないencode()と、Python が Unicode 文字を数字のタプルとして拒否するためです。

于 2016-05-14T17:47:35.337 に答える