2017-01-10 9 views
0

簡易印刷機能Python2.7印刷Unicode文字列: 'ASCII' コーデックが文字をエンコードすることはできません...序ない範囲内(128)

この

TODO(u'api servisleri için input check decorator gerekiyor') 
のように呼ばれる
def TODO(message): 
    print(type(message)) 
    print(u'\n~*~ TODO ~*~ \n %s\n  ~*~\n' % message) 

このエラー

<type 'unicode'>                     
Traceback (most recent call last):                
    File "/srv/www/proj/__init__.py", line 38, in <module>          
    TODO(u'api servisleri için input check decorator gerekiyor')         
    File "/srv/www/proj/helpers/utils.py", line 33, in TODO          
    print(u'\n~*~ TODO ~*~ \n %s\n  ~*~\n' % message)           
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 32: ordinal not in range(128) 

で結果しかし、それはipythonコンソールで動作します

In [10]: TODO(u'api servisleri için input check decorator gerekiyor') 
<type 'unicode'> 

~*~ TODO ~*~ 
api servisleri için input check decorator gerekiyor 
    ~*~ 

これはpython 2.7.12で動作しますが、2.7.9では何とか失敗します。

私はここで間違っていますか?

編集:フラスコアプリケーションで呼び出されたときに機能が失敗し、Pythonコンソールで機能します。

+0

コマンドラインから複数のバージョンのPython 2.6.6,2.7.9,2.7.10、および2.7.13であなたのコードを試したところ、コードはうまくいきました。 – 2ps

+0

コンソールのロケールが壊れており、デフォルトでASCIIになっているようです。あなたはどのOSを使用していますか? –

+1

私はあなたがUn * xシステムにいると仮定します。参照:http://stackoverflow.com/a/35839964/1554386 –

答えて

-1

\xe7

小さな 'ç'を表すutf-8文字の1つです。 Python 2.7.9はおそらくASCIIでエンコードされます。下記のコードは、Python 2.7.9の動作を表す任意のバージョンのPythonで実行できます。

import sys; 
# -*- coding: utf-8 -*- 

def TODO(message): 
    print(type(message)) 
    print(u'\n~*~ TODO ~*~ \n %s\n  ~*~\n' % message) 

message = u'api servisleri için input check decorator gerekiyor' 
encodedMessage = message.encode('ascii') 

print(sys.stdout.encoding) 
TODO(encodedMessage) 

それは

Traceback (most recent call last): File "test.py", line 9, in encodedMessage = message.encode('ascii') UnicodeEncodeError: 'ascii' codec can't encode character '\xe7' in position 16: ordinal not in range(128)

ので、問題はインタプリタの符号化規則に関連している例外がスローされます。自分でエンコードすることも、無視することもできます。

は、印刷機能はprint文とは少し異なっている、それはどうやら

-1

役立つことを願っています。それは多分、2.7.12でロケールの事を働く理由

https://docs.python.org/2.7/library/functions.html#print

All non-keyword arguments are converted to strings like 
str() does and written to the stream, separated by sep 
and followed by end. 

は単純に、Unicode文字列をコードする、まだ確認してくださいそれ

msg = u'\n~*~ TODO ~*~ \n %s\n  ~*~\n' % message 
print(msg.encode("utf-8")) 

をしませ解決しましたか?

+1

これは答えではありません。 @Alastairのコメントを参照して環境を修正してください。あなたがやっていることは、UTF-8以外の端末では動作しないUTF-8に手動でエンコードすることです。 UTF-8をPythonに正しく報告するように端末を設定し、 'printu'için''が動作します。 Print関数とステートメントは赤字ですが、 'from __future__ import print_function'を使わない限り、Python 2は印刷機能を持っていません。これはPython 3の関数に変わります。 –

+0

どちらの環境も同じロケール出力を持ちます。そして私が言及した文書で述べたように、これは印刷機能の期待される出力です。これは、印刷機能が失敗したマシンでのprintの出力です。 '╰─$ python Python 2.7.9(デフォルト、2016年6月29日、13:08:31) [GCC 4.9.2] on linux2 「ヘルプ」、「著作権」、「クレジット」または「ライセンス」は、詳しくは。 >>>印刷する ' i'in' –

0

異なる端末(およびGUI)では、さまざまなエンコードが可能です。最近のipythonは便利ではありませんが、文字列にASCII以外の0xe7文字('ç')を処理できることは明らかです。ただし、通常のコンソールでは'ascii'エンコーディング(例外では名前で言及されています)を使用していますが、0x7fより大きいバイトは表示できません。

非ASCII文字列をASCIIコンソールに印刷する場合は、表示できない文字をどのように扱うかを決める必要があります。str.encode方法はいくつかのオプションを提供しています:

#!/usr/bin/env python2 
# -*- coding: utf-8 -*- 

from __future__ import print_function 

uni = u'api servisleri için input check decorator gerekiyor' 
handlers = ['ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace'] 
for handler in handlers: 
    print(handler + ':') 
    print(uni.encode('ascii', handler)) 
    print() 

出力:

str.encode([encoding[, errors]])

errors may be given to set a different error handling scheme. The default for errors is 'strict' , meaning that encoding errors raise a UnicodeError . Other possible values are 'ignore' , 'replace' , 'xmlcharrefreplace' , 'backslashreplace' and any other name registered via codecs.register_error() , see section Codec Base Classes .

ここで(TODOで追加された余分な装飾のない)あなたの文字列にこれら4つの代替エラー・ハンドラのそれぞれを使用する例を示します。

ignore: 
api servisleri iin input check decorator gerekiyor 

replace: 
api servisleri i?in input check decorator gerekiyor 

xmlcharrefreplace: 
api servisleri i&#231;in input check decorator gerekiyor 

backslashreplace: 
api servisleri i\xe7in input check decorator gerekiyor 

あなたが望むものに最も近い出力がどれかを決定することです。

詳細については、Python 2「Unicode HOWTO」とNed Batchelderの「Pragmatic Unicode, or, How Do I Stop the Pain?」を参照してください。また、36分video from PyCon US 2012としても入手できます。

編集:...または、あなたが発見したように見えるとして、あなたの端末がうまくUnicodeを表示することができますが、あなたのデフォルトのエンコーディングは、それにもかかわらず、それがために必要以上に制限されている、'ascii'に設定されています。

関連する問題