2011-08-11 16 views
1

Ubuntuのコマンドラインで動作するPythonスクリプトで、MySQLデータベースからUTF8でエンコードされたコンテンツを選択しています。Ubuntuの端末にPythonスクリプトでUTF8の刺しゅうを表示する

次に、文字列をコンソールに出力します。

表示された文字列には、アクセント付き文字が正しく表示されないため、エンコードに問題があります。これをどうやって解決するのですか?

スクリプトは、システム環境を設定するのではなく、他のシステムで簡単に実行できるようにすることが望ましいでしょう。

+0

あなたのロケールの設定は、実際に端末の設定と一致していますか? –

+0

端末の設定に頼らないでください。すべてのエンコーディングをUTF-8に設定し、すべてのheisenbugを破棄します。 – tchrist

答えて

2

「?」を使用しないことを強くお勧めします。代替文字として。あなたの出力エンコーディングをUTF-8に設定し、それを使って終了してください。

for s in ("stdin","stdout","stderr"): 
    setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8")) 

代わりにPythonが出力エンコーディングについて推測停止するように、UTF8にごPYTHONIOENCODING envariableを設定します。

いずれのアプローチも、手動でエンコードするよりもはるかに優れています。これは愚かです。

あなたがのpython3にアップグレードすることを拒否した場合、私はまた、すべての愚かなu'...'ものを追放するために

from __future__ import unicode_literals 

をお勧めします。このような

最近、私が開始したすべての私のPython progamsは:

#!/usr/bin/env python3.2 
# -*- coding: UTF-8 -*- 

from __future__ import print_function 
from __future__ import unicode_literals 

import re 
import sys 
import os 

if not (("PYTHONIOENCODING" in os.environ) 
      and 
     re.search("^utf-?8$", os.environ["PYTHONIOENCODING"], re.I)): 
    sys.stderr.write(sys.argv[0] + ": Please set your PYTHONIOENCODING envariable to utf8\n") 
    sys.exit(1) 

import unicodedata 
if unicodedata.unidata_version < "6.0.0": 
    print("WARNING: Your old UCD is out of date, expected at least 6.0.0 but got", 
      unicodedata.unidata_version) 

wide_enough = (sys.maxunicode >= 0x10FFFF) 
if not wide_enough: 
    print("WARNING: Narrow build detected, your Python lacks full Unicode support!!") 
+0

ありがとうございます。私が使用した編集中: 'インポート 再輸入SYS 輸入OS ていない場合((はos.environで "PYTHONIOENCODING") と re.search( "^ UTF-8 $?"、はos.environ [ sys.exit(1) ' インポートがありました。(" PYTHONIOENCODING "、re.I)): sys.stderr.write(sys.argv [0] +":PYTHONIOENCODINGの変数をutf8に設定してください。最初のコードを実行するためにはうまくいかなかった。 – eoinoc

1

あなたはこのようなSTDOUTの現在のエンコーディングを取得することができます:

>>> import sys 
>>> sys.stdout.encoding 
UTF-8 

そして、それに応じてUnicode文字列をエンコードする:

>>> u"Ä" 
u'\xc4' 
>>> sys.stdout.write(u"Ä".encode(enc, 'replace')) 

'replace'はキャラクターが、端末の中に表現できないとき、UnicodeEncodeErrorsを回避エンコーディング。これは疑問符に置き換えられます。

0

テキストの入力エンコーディング(UTF-8、ここでは)問題ではありません。あなたは、テキストを印刷し、その後、できるだけ早くユニコードにUTF8-バイト文字列を変換する必要があります:

  • を印刷するためにUTF8を使用してテキストをエンコードするためにsys.stdoutを変更しないでください前に

    print(unicode_text) 
    
    • はUTF8にテキストをコードしていませんあなた

    出力エンコーディングは、ロケール設定(LANGLC_CTYPELC_ALL)またはPYTHONIOENCODING ENVVARに基づいてスクリプトを実行する環境によって指定されます。無条件にutf8を出力しないでください。

    たとえば、ロケールが設定されていない場合、あなたは明示的に指定することができます。

    $ LANG=en_US.utf8 python your_script.py 
    

    をお使いの端末が(フォント、対応するロケール(locale -a)がインストールされている)に対応するUnicode文字を表示できることを確認してください。

    つまり、出力を修正するには、環境を修正してください(例:configure your locale settings to use C.UTF-8 by default)。

  • 関連する問題