Python文字列のuプレフィックスは何ですか?


232

のように:

u'Hello'

私の推測では、これは「Unicode」を示していると思いますが、それは正しいですか。

もしそうなら、いつから利用できますか?

回答:


147

その通りです。3.1.3を参照してくださいUnicodeの文字列

Python 2.0以降の構文です。

デフォルトの文字列タイプはUnicodeであるため、Python 3はそれらを冗長にしました。バージョン3.0から3.2はそれらを削除しましたが、2から3への移行を支援するためにPython 2との互換性のために3.3以降再び追加されました


6
Python 3ではもう必要ありませんが、構文は有効であることを付け加えてください。
Martin Thoma

ユニコード+生(正規表現)文字列(例ur"string"
:)の組み合わせ

123

u in u'Some String'は、文字列がUnicode文字列であることを意味します。

Q:私はひどい、ひどい急いでいて、Google検索からここに着陸しました。このデータをファイルに書き込もうとすると、エラーが発生します。この2番目の方法としては、最も単純な、おそらく欠陥のある、解決策が必要です。

A:あなたは本当にジョエルの読むべきUnicodeとキャラクタセットについて知っておくべき、絶対に絶対最小すべてのソフトウェア開発者を(言い訳!)の文字セットのエッセイ。

Q:時間コードplsを使用しないでください

罰金。str('Some String')またはを試してください'Some String'.encode('ascii', 'ignore')。しかし、あなたは本当に上の答えと議論の一部をお読みくださいUnicode文字列に変換し、この文字エンコーディングに優れ、優れた、プライマーを。


6
これは、文字列にASCIIテキストのみが含まれる場合に機能します。その他の場合はすべて、明示的にエンコードする必要があります。
Martijn Pieters

2
これはu ''を「取り除く」ためのものとして扱います。これは、あなたが実際にそれが何であるかを理解していないことを教えてくれます。一般的には、単に「取り除く」だけではなく、Unicode文字列からバイト文字列を作成する正しい方法は、その文字列に含まれる内容とコンテキストによって異なります。
Lennart Regebro 2014

2
@LennartRegebroは完全に同意しました-これはほのぼのしたことを意図した使い捨ての回答でしたが、それは一種の恐ろしい数の賛成票を蓄積しました。人々を正しい方向に導くために編集されました。
Andrew

1
楽しかったです!ありがとう!記事は17歳であり、まだ正確です。ワオ。
Kerwin Sneijders

52

私の推測では、これは「Unicode」を示していると思いますが、それは正しいですか。

はい。

もしそうなら、いつから利用できますか?

Python2.x。

Python 3.xでは、文字列はデフォルトでUnicodeを使用し、uプレフィックスは必要ありません。注: Python 3.0-3.2では、uは構文エラーです。Python 3.3以降では、2/3互換のアプリを簡単に作成できるようになりました。


4
u接頭辞を使用するのは、Python 3の構文エラーです。
Tim Pietzcker

14
@TimPietzcker:3.0-3.2のみ。3.3以降では、2.6以降/ 3.3以降の単一コードベースのライブラリとアプリを簡単に作成できるようにすることは合法です(無意味です)。
abarnert 2014

@abarnert:まあ、そのコメントは現在4年半前のものです:)
Tim Pietzcker

3
@TimPietzcker:もちろんですが、あなたのコメントが2010年に検索でこの有用な回答を見つけた人にとって有用な補遺だったのと同じように、2014年に見つけた人に3.3の変更点について言及することは有益だと思います。答えですが、ほとんどの人が遭遇しないことはマイナーなポイントだと思います(2014年にまだ3.0-3.2を使用しているのでなければ、「プレフィックスは必要ない」だけで十分です)。
abarnert 2014

任意のユーザーがダウンロードして実行するためのコードを記述していて、想定せずに最も可能性の高いケースをカバーしたい場合、3.0-3.2が機能しないことを知っておくと役立ちます。six.text_type()まだ3 を使用している(できれば非常に少ない)人数でどこでも使用するかどうかを判断する必要があるためです。[012] -少なくとも情報があるので、選択できます。
dwanderson 2018

3

requests出力に変なチャー症候群があったため、ここに来ました。response.text適切にデコードされた文字列が得られると思いましたが、出力では、ドイツ語のウムラウトがあったはずの面白い二重文字が見つかりました。

ターンが出てresponse.encoding何とか空だったので、response適切にコンテンツをデコードする方法を知りませんでしたし、ちょうどASCII(私は推測)としてそれを扱います。

私の解決策は、「response.content」で生のバイトを取得し、それに手動で適用decode('utf_8')することでした。その結果がシェーネ・ウムラウテでした。

正しくデコードされた

毛皮

対不適切にデコード

fĂźr


2

人間向けの文字列はすべてu ""を使用する必要があります。

次の考え方は、Python文字列を処理するときに非常に役立ちます。すべての Pythonマニフェスト文字列はu""構文を使用する必要があります。""構文は、バイト配列のためです。

バッシングが始まる前に、説明させてください。ほとんどのPythonプログラムは""、文字列の使用から始まります。しかし、彼らはインターネット以外のドキュメントをサポートする必要があるため、使用を開始する"".decodeと、突然、これとそれをデコードすることに関してどこでも例外が発生します-すべて""が文字列の使用のためです。この場合、Unicodeはウイルスのように機能し、大混乱を引き起こします。

しかし、私のルールに従えば、この感染はありません(すでに感染しているためです)。


bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
kennytm

@KennyTMいいですね!単に人間向けのすべての文字列を使用することを意味しますu""
フランク・クルーガー、

1
すべての場所で(すべてではないが)多くのアプリケーションでUnicodeを忠実に使用したい場合は、2.xではなくPython 3.xが望ましいでしょう。これが書かれた2010年には当てはまらなかったかもしれませんが、2014年には、3.xへのアップグレードを妨げるほとんどのライブラリまたはプラットフォームも、Unicodeの適切な使用を妨げます…
abarnert

1

それはユニコードです。

変数を間に置くだけ str()にで問題なく動作します。

ただし、次のような2つのリストがある場合:

a = ['co32','co36']
b = [u'co32',u'co36']

をチェックset(a)==set(b)するとFalseになりますが、次のようにすると:

b = str(b)
set(a)==set(b)

これで、結果はTrueになります。


危険、危険。エンコードを渡さずにUnicode(str()またはu'€'.encode())をエンコードしないでください。文字列に非ASCIIが含まれている場合、ユーザーはUnicodeEncodeExceptionを受け取ります。
Alastair McCormack 2016

3
さらに、コードは機能しません。リストb = str(b)の文字列repr()、つまりb = "[u'co32', u'co36']"。その後set(a)==set(b) = False
Alastair McCormack
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.