2009-07-12 8 views
19

Pythonでコーディングするときに、通常の文字列よりもUnicode文字列を選択することをお勧めしますか?私は主に、最近の文字列型のほとんどがUnicodeであるWindowsプラットフォーム(つまり、.NET String、 '_UNICODE'は新しいC++プロジェクトではデフォルトでオンになっています)で作業します。したがって、非Unicode文字列オブジェクトが使用されるケースはまれなケースだと思う傾向があります。とにかく、実世界のプロジェクトでPythonの実務家が何をしているのかが不思議です。デフォルトでUnicode文字列を使用する必要がありますか?

答えて

17

私の練習から - ユニコードを使用してください。

プロジェクトの始めに、私たちはusuall文字列を使用しましたが、私たちのプロジェクトは成長していましたが、新しい機能を実装し、新しいサードパーティライブラリを使用していました。非ユニコード/ユニコード文字列の混乱で、いくつかの関数が失敗し始めました。私たちは、この問題のローカライズと修正に時間を費やし始めました。しかし、サードパーティのモジュールの中には、ユニコードをサポートしていないものがあり、切り替えた後に失敗してしまいました(しかし、これはルールよりむしろ除外されています)。

また、サードパーティのモジュール(SendKeysなど)を書き直す必要があるときに、私はユニコードをサポートしていなかったので、いくつかの経験があります。それが最初からユニコードで済んでいればそれはより良いでしょう:)

私は今日ユニコードを使うべきだと思います。

P.S.すべて上向きに混乱しているのは私のハムの意見だけです。

+2

+1:テキストを処理するときは常にユニコードを使用してください。テキストデータをバイトとして扱う必要が生じるときはいつでも(例えば、ネットワーク上を移動したりディスクに書き込んだりするときなど)、ユニコードをバイト列(Pythonの文字列として表現)に変換します。エンコードまたはユニコードを呼び出して変換します。 – codeape

2

厳しい制約のあるメモリまたはディスクスペースを扱う場合は、ASCII文字列を使用してください。この場合、あなたのソフトウェアをC言語で書かなければなりません。もっとコンパクトなものを書くべきでしょう。

13

あなたはこの質問をしています。あなたはPython 2.xを使っていると思います。

Python 3.0が文字列表現でかなり変更されました。すべてのテキストがUnicodeです。
新しいプロジェクトでは、Python 3.0のスイッチと互換性のある方法でユニコードを使用します(details参照)。

+0

ええ、将来の互換性は非常に重要です! –

4

Mihailsのコメントに追加して、私はこう言うでしょう:それは未来であるため、Unicodeを使用してください。 Python 3.0では、非Unicodeはなくなりました。私が知っている限り、すべての "U" -Prefixesもまたなくなりました。

5

一貫してのPython 2.xでUnicode文字列を使用するのが難しいことができます - 何でも - 誰かがうっかり彼らは文字列リテラル、サードパーティのモジュールの非互換性にuプレフィックスを忘れ、unicode(blah)を意味し、より自然なstr(blah)を使用していますので、それも。したがって、Python 2.xでは、必要な場合にのみUnicodeを使用し、良い単体テストカバレッジを提供できるように準備されています。

ただし、Python 3.xを使用するオプションがある場合は、気にする必要はありません。文字列は特別な努力なしにユニコードになります。

13

はい、ユニコードを使用してください。

いくつかのヒント:

  1. バイナリ形式の任意の並べ替えで入出力を行う、あなたは文字列とユニコードをミックスする必要はありませんように、読んだ後に直接デコードし、書き込む前に直接エンコードします。ミキシングは、遅かれ早かれUnicodeEncodeDecodeErrorsにつながる傾向があります。

  2. [これについては忘れて、私の説明ではさらに混乱させてしまった。それはPython 3に移植するときの唯一の問題です。あなたはそれを気にすることができます。]

  3. 一般的なPython初心者のエラー(あなたは初心者ではありませんが、これは初心者が読むかもしれません):エンコードとデコードを混同しないでください。 UTF-8はENコードであることを覚えておいてください。そうすれば、UnicodeからUTF-8へのエンコードとDEcodeからのエンコードが可能になります。

  4. Pythonで(sitecustomize.pyなどでsetdefaultencodingによって)デフォルトのエンコードを設定するのは、あなたが最もよく使うものに設定しないでください。それは、あなたが別のコンピュータを再インストールしたり、別のコンピュータに移動したり、突然別のエンコーディングを使用する必要がある場合には、問題を引き起こすことになります。明示してください。

  5. Python 2sの標準ライブラリのすべてがunicodeを受け入れるわけではありません。メソッドのUnicodeをフィードしてもうまくいかない場合は、それをasciiに渡してみてください。例:urllib.urlopen()。文字列の代わりにUnicodeオブジェクトを渡すと、役に立たないエラーで失敗します。

hm。それは私が今考えることができるすべてです!

+0

ポイント3は本当です - 私が知っている(私を含む)誰もがこのエラーを作り、一度だけではありません! –

+1

Re: "書いた直後にエンコードする" - 明確にすることはできますか?私はそれが "after"の代わりに "before"でなければならないと思うが、私はあなたの意見が不足しているかもしれない。 – ars

+0

@Lennart: "ユニコードをASCII以外のテキストでいっぱいの文字列にエンコードしたとしても、これはPythonによるとまだテキストです。" ... 3.xでは、str.encode()は型バイトを返し、アスキーなのかどうかの区別は無関係です。あなたがしようとしていることは何ですか? –

関連する問題