Pythonでコーディングするときに、通常の文字列よりもUnicode文字列を選択することをお勧めしますか?私は主に、最近の文字列型のほとんどがUnicodeであるWindowsプラットフォーム(つまり、.NET String、 '_UNICODE'は新しいC++プロジェクトではデフォルトでオンになっています)で作業します。したがって、非Unicode文字列オブジェクトが使用されるケースはまれなケースだと思う傾向があります。とにかく、実世界のプロジェクトでPythonの実務家が何をしているのかが不思議です。デフォルトでUnicode文字列を使用する必要がありますか?
答えて
私の練習から - ユニコードを使用してください。
プロジェクトの始めに、私たちはusuall文字列を使用しましたが、私たちのプロジェクトは成長していましたが、新しい機能を実装し、新しいサードパーティライブラリを使用していました。非ユニコード/ユニコード文字列の混乱で、いくつかの関数が失敗し始めました。私たちは、この問題のローカライズと修正に時間を費やし始めました。しかし、サードパーティのモジュールの中には、ユニコードをサポートしていないものがあり、切り替えた後に失敗してしまいました(しかし、これはルールよりむしろ除外されています)。
また、サードパーティのモジュール(SendKeysなど)を書き直す必要があるときに、私はユニコードをサポートしていなかったので、いくつかの経験があります。それが最初からユニコードで済んでいればそれはより良いでしょう:)
私は今日ユニコードを使うべきだと思います。
P.S.すべて上向きに混乱しているのは私のハムの意見だけです。
厳しい制約のあるメモリまたはディスクスペースを扱う場合は、ASCII文字列を使用してください。この場合、あなたのソフトウェアをC言語で書かなければなりません。もっとコンパクトなものを書くべきでしょう。
あなたはこの質問をしています。あなたはPython 2.xを使っていると思います。
Python 3.0が文字列表現でかなり変更されました。すべてのテキストがUnicodeです。
新しいプロジェクトでは、Python 3.0のスイッチと互換性のある方法でユニコードを使用します(details参照)。
ええ、将来の互換性は非常に重要です! –
Mihailsのコメントに追加して、私はこう言うでしょう:それは未来であるため、Unicodeを使用してください。 Python 3.0では、非Unicodeはなくなりました。私が知っている限り、すべての "U" -Prefixesもまたなくなりました。
一貫してのPython 2.xでUnicode文字列を使用するのが難しいことができます - 何でも - 誰かがうっかり彼らは文字列リテラル、サードパーティのモジュールの非互換性にu
プレフィックスを忘れ、unicode(blah)
を意味し、より自然なstr(blah)
を使用していますので、それも。したがって、Python 2.xでは、必要な場合にのみUnicodeを使用し、良い単体テストカバレッジを提供できるように準備されています。
ただし、Python 3.xを使用するオプションがある場合は、気にする必要はありません。文字列は特別な努力なしにユニコードになります。
はい、ユニコードを使用してください。
いくつかのヒント:
バイナリ形式の任意の並べ替えで入出力を行う、あなたは文字列とユニコードをミックスする必要はありませんように、読んだ後に直接デコードし、書き込む前に直接エンコードします。ミキシングは、遅かれ早かれUnicodeEncodeDecodeErrorsにつながる傾向があります。
[これについては忘れて、私の説明ではさらに混乱させてしまった。それはPython 3に移植するときの唯一の問題です。あなたはそれを気にすることができます。]
一般的なPython初心者のエラー(あなたは初心者ではありませんが、これは初心者が読むかもしれません):エンコードとデコードを混同しないでください。 UTF-8はENコードであることを覚えておいてください。そうすれば、UnicodeからUTF-8へのエンコードとDEcodeからのエンコードが可能になります。
Pythonで(sitecustomize.pyなどでsetdefaultencodingによって)デフォルトのエンコードを設定するのは、あなたが最もよく使うものに設定しないでください。それは、あなたが別のコンピュータを再インストールしたり、別のコンピュータに移動したり、突然別のエンコーディングを使用する必要がある場合には、問題を引き起こすことになります。明示してください。
Python 2sの標準ライブラリのすべてがunicodeを受け入れるわけではありません。メソッドのUnicodeをフィードしてもうまくいかない場合は、それをasciiに渡してみてください。例:urllib.urlopen()。文字列の代わりにUnicodeオブジェクトを渡すと、役に立たないエラーで失敗します。
hm。それは私が今考えることができるすべてです!
ポイント3は本当です - 私が知っている(私を含む)誰もがこのエラーを作り、一度だけではありません! –
Re: "書いた直後にエンコードする" - 明確にすることはできますか?私はそれが "after"の代わりに "before"でなければならないと思うが、私はあなたの意見が不足しているかもしれない。 – ars
@Lennart: "ユニコードをASCII以外のテキストでいっぱいの文字列にエンコードしたとしても、これはPythonによるとまだテキストです。" ... 3.xでは、str.encode()は型バイトを返し、アスキーなのかどうかの区別は無関係です。あなたがしようとしていることは何ですか? –
- 1. sequelize(node.js)でエスケープ文字列を使用する必要がありますか?
- 2. PDO:文字列をエスケープする必要がありますか?
- 3. 文字列一致を使用する場合、特殊文字をエスケープする必要がありますか?
- 4. 文字列定数または文字列リテラルを使用する必要があります
- 5. 絵文字のedittextはUnicodeを返す必要があります
- 6. whooshはすべての文字列をUnicodeにする必要がありますか?
- 7. preg_match文字列はアルファベット文字で始まる必要があります
- 8. どのパスが文字列である必要がありますか?
- 9. 文字列から数字を抽出する必要があります
- 10. HTML5構文を使用する必要がありますか?
- 11. HTML5文字セット文字エンコーディング宣言:スペイン語文字を使用する必要がありますか?
- 12. C#で文字列連結が安全でない、StringBuilderを使用する必要がありますか?
- 13. TypeScriptで戻り値の型として文字列リテラルを使用する必要がありますか?
- 14. JavaScriptを使用して文字列内の連続した文字をフィルタリングする必要があります
- 15. nimblekitで配列を使用する必要があります
- 16. cで文字列終了文字 '\ 0'を手動で割り当てる必要がありますか?
- 17. 文字列から空白を削除する必要がありますJavaを使用する
- 18. Python - デフォルトでプロジェクト内のすべての文字列をUnicodeにする方法はありますか?
- 19. TreeTaggerでタグ付けしながら、* unicode *文字列をタグとしてテキストとして使用する必要がありますか?
- 20. "||"をエスケープする必要があります文字列からの条件
- 21. ファイル名から文字列を抽出する必要があります
- 22. C++の文字列を破棄する必要がありますか?
- 23. フォーマット文字列をリソースに格納する必要がありますか?
- 24. 文字列パラメータをスーパータイプに昇格する必要がありますか?
- 25. http://ラッパーは無効ですが、クエリ文字列を使用する必要があります
- 26. 私はASCII文字列に変換する必要がある文字列を、どのように変換する必要がありますか?
- 27. 配列内のEXACT文字列を置換する必要があります
- 28. JQuery、JSON文字列を配列に分割する必要があります
- 29. WCFとDelphi - バイト[]または文字列を使用する必要がありますか?
- 30. GraphQLオブジェクトのプロパティは文字列のリストである必要があります
+1:テキストを処理するときは常にユニコードを使用してください。テキストデータをバイトとして扱う必要が生じるときはいつでも(例えば、ネットワーク上を移動したりディスクに書き込んだりするときなど)、ユニコードをバイト列(Pythonの文字列として表現)に変換します。エンコードまたはユニコードを呼び出して変換します。 – codeape