2012-02-01 14 views
5

一覧は

lst = [ u"aaa", u"bbb", u"foo", u"bar", ... u"baz", u"zzz" ] 

は、すべての文字列の前に接頭辞uを書くことが必要なのか? lstのすべての要素がUnicode文字列になり、接頭辞なしで書くことができますか?

+0

これは私が 'のPython 2.7.2 +'を使用していますが、あなたは、両方のための答えを知っていればそれができるのPython 2やPython 3 –

+0

を使用して、あなたに依存将来に役立つ。 – xralf

+0

Python 3.xでは、すべてのstrignsはデフォルトでunicodeであり、テキストI/O(ファイル、データベース、印刷)を扱うチャネルは、explcitエンコーディングを必要とするか、デフォルトでシステムワイドエンコーディングを使用します。 – jsbueno

答えて

14

は、Python 2.7(また、Pythonの2.6)では、あなたは、Unicodeリテラルモジュールのデフォルト行うことができます:あなたはファイルの先頭にインポートが含まれている必要があり

from __future__ import unicode_literals 

、そしてそれは、すべてに適用されますファイル内の文字列リテラル。バイト文字列を強制的にb接頭辞を使用します。

>>> from __future__ import unicode_literals 
>>> "sss" 
u'sss' 
>>> b"x" 
'x' 
1

あなたの意図はunicodeに標準文字列のセットを変換することであるならば、あなたはあなたのリストにその関数をマップできます。ただしlstは、非ASCIIが含まれている場合

[u"aaa", u"bbb", u"ccc"] 

を与える

lst = ["aaa", "bbb", "ccc"] 
map(unicode, lst) 

その特定の文字列に接頭辞としてuを付ける必要があります。そうでない場合は、変換時にこのエラーが発生します:

lst = ["\xe4"] 
map(unicode,lst) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) 

コメントで述べたように、この答えは、Python 2.xまたは3.xの異なりますPython 3では、everything changes

バイナリデータとUnicodeについて知っていたと思ったことはすべて変更されました。 Python 3.0では、Unicode文字列と8ビット文字列ではなく、テキストと(バイナリ)データの概念が使用されています。すべてのテキストはUnicodeです。エンコードされたUnicodeはバイナリデータとして表されます。テキストを保持するために使用される型はstrです。データを保持するために使用される型はバイトです。 2.xの状況との最大の違いは、Python 3.0でテキストとデータを混在させようとするとTypeErrorが発生するのに対し、Python 2.xではUnicodeと8ビットの文字列を混在させると、8ビット文字列には7ビット(ASCII)バイトのみが含まれていましたが、ASCII以外の値が含まれているとUnicodeDecodeErrorが返されます。この価値特有の行動は、何年にもわたって数多くの悲しい顔を引き起こしました。

+0

私は入力を節約するより良い宣言だけを使用したいと思います。 'lst = u [" aaa "、" bbb "、" ccc "]'のようなもので、 'lst'のすべての文字列がUnicodeであることを示します。 – xralf

+0

-1ユニコードのエンコーディングを知らず、 "ASCIIはOK"と思っています - http://www.joelonsoftware.com/articles/Unicode.htmlをご覧ください。 – jsbueno

+0

@jsbueno - デフォルトのPython 2はどこにもありませんでした。 xエンコーディング(ASCII)は「OK」です。 OPのASCIIコードのみをASCIIコードでUnicodeに変換するOPのリストを変換するための素早く汚れたメソッドを述べました。彼は何を望んでいたのですか?彼が望むエンコーディングを指定していないので、私は完全にはわからないので、私は推測しました。このサイトに価値を追加するには、異なるエンコーディングについての詳細な説明が必要と思われる場合は、別の答えで入力してください! – Hooked