web-dev-qa-db-ja.com

私のコードで中国語の単語を印刷する方法.. python

これは私のコードです:

print '哈哈'.decode('gb2312').encode('utf-8')

...そしてそれは印刷します:

SyntaxError: Non-ASCII character '\xe5' in file D:\zjm_code\a.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

'哈哈'を印刷するにはどうすればよいですか?

更新:次のコードを使用する場合:

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

print '哈哈'

... 鍝堝搱を出力します。それは私が欲しかったものではありません。

私のIDEはUlipadですが、これはIDEのバグですか?

2回目の更新:

このコードは文字を正しく出力します:

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


print u'哈哈'.encode('gb2312')

...そして私がこれを使うとき:

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

a='哈哈'
print a.encode('gb2312')
Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 5, in <module>
    print a.encode('gb2312')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

...または...

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

a='哈哈'
print unicode(a).encode('gb2312')
Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 5, in <module>
    print unicode(a).encode('gb2312')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

...それは機能しません。変数aを適切に出力するにはどうすればよいですか?

ありがとう

12
zjm1126

エラーメッセージが非常に明確に示しているように、最初にエンコーディングを宣言する必要があります-詳細については ここ を確認するように指示されています!あなたのエンコーディングはおそらくgb2312です。

ところで、(同じエンコーディング宣言を使用して)実行する方が簡単です

print u'哈哈'.encode('utf-8')

sys.stdoutencode属性が適切に設定されている場合(端末、OSなどによって異なります)、encodingの部分も必要ない場合があります。

10
Alex Martelli

pythonソースコードファイルのエンコーディングを指定する必要があります。これがutf-8のコーディングです。右上のpythonインタプリタのパスの下にあります。

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

エラーメッセージのURL に移動すると、pythonソースファイルのエンコーディングの指定に関する詳細情報を見つけることができます。

ソースファイルのエンコーディングを指定したら、テキストをデコードする必要はありません。

4
vfilby

次のコードは私のために働きます:

# coding: utf8
print u'哈哈'.encode('utf-8')

#codingコメントはPythonファイル自体のエンコーディングを示しているので、UTF-8文字を直接埋め込むことができます。Unicode文字列から開始する場合は、デコードする必要はありません。それを再エンコードします。

2
Will McCutchen

端末の文字エンコードを確認する必要があります。

私の端末では、最初に文字エンコードをutf-8に設定しましたが、すべて問題ありません。

GBKに設定すると、「鍝堝搱」になります。

1
yaiba

Will McCutchenの回答に基づいて、これも機能します。

# coding: utf8
print '哈哈'
1
HaoQi Li

Unicode文字でエンコードすることはできません。エンコードは、Unicodeでエンコードされたすべての文字を他のコードスタイルに変換するために使用されます。文字のUnicodeには使用できません。

物議を醸す方法では、デコードは、Unicodeでエンコードされていない文字にのみ使用してUnicode文字に変換できます。

文字列の前に「u」文字を含む文字列を宣言すると、Unicodeでエンコードされた文字列が得られます。 isinstance(str、unicode)を使用して、strがユニコードでエンコードされているかどうかを検出できます。

以下のこのコードを試してください。ヒント:中国語版のWindowsでは、デフォルトのコードスタイルは「gbk」です。

>>> a = '哈哈'
>>> b = u '哈哈'
>>> isinstance(a、unicode)
誤り
>>> isinstance(b、unicode)
True

>>> a
'\ xb9\xfe\xb9\xfe'
>>> b
u '\ u54c8\u54c8'

>>> a.decode( 'gbk')
u '\ u54c8\u54c8'
>>> a_unicode = a.decode( 'gbk')
>>> a_unicode
u '\ u54c8\u54c8'

>>>印刷a_unicode
哈哈
>>> a_unicode.encode( 'gbk')== a
True
>>> a_unicode == b
True

>>> a.encode( 'gbk')
トレースバック(最後の最後の呼び出し):ファイル ""、行1、UnicodeDecodeError: 'ascii'コーデックは位置0のバイト0xb9をデコードできません:序数が範囲内にありません(128)

>>> b.decode( 'gbk')
トレースバック(最後の最後の呼び出し):ファイル ""、行1、UnicodeEncodeError: 'ascii'コーデックは位置0-1の文字をエンコードできません:序数が範囲内にありません(128)

1
heLomaN