1. ホーム
  2. python

[解決済み] Pythonのstr型とunicode型

2022-10-14 14:20:47

質問

Python 2.7で作業しているとき、私は型 unicode の代わりに str のように、どちらも Unicode 文字列を保持することができるように思われます。に Unicode コードを設定できること以外に何か特別な理由があるのでしょうか? unicode 文字列に Unicode コードを設定できること以外に何か特別な理由があるのでしょうか? \ ?:

でモジュールを実行。

# -*- coding: utf-8 -*-

a = 'á'
ua = u'á'
print a, ua

結果: á, á

EDITです。

Pythonのシェルを使ってさらにテストしています。

>>> a = 'á'
>>> a
'\xc3\xa1'
>>> ua = u'á'
>>> ua
u'\xe1'
>>> ua.encode('utf8')
'\xc3\xa1'
>>> ua.encode('latin1')
'\xe1'
>>> ua
u'\xe1'

で、その unicode という文字列がエンコードされているようです。 latin1 ではなく utf-8 でエンコードされ、生の文字列は utf-8 ? さらに混乱しました! :S

どのように解決するのですか?

unicode テキスト . テキストは、一連の コードポイント どの は1バイトより大きいかもしれません . テキストは エンコード で、テキストを生のバイトとして表現する特定のエンコーディングで(例えば utf-8 , latin-1 ...).

なお、この unicode はエンコードされません。 ! pythonが使用する内部表現は実装の詳細であり、あなたが望むコードポイントを表現できる限り、それを気にする必要はないでしょう。

逆に str は、Python 2のプレーンシークエンスである バイト . これはテキストを表すものではありません!

を考えることができます。 unicode で表現されるバイナリデータのシーケンスに様々な方法でエンコードすることができます。 str .

注:Python 3では unicode は改名され str となり、新たに bytes 型が追加され、プレーンなバイト列の

見てわかるいくつかの違い。

>>> len(u'à')  # a single code point
1
>>> len('à')   # by default utf-8 -> takes two bytes
2
>>> len(u'à'.encode('utf-8'))
2
>>> len(u'à'.encode('latin1'))  # in latin1 it takes one byte
1
>>> print u'à'.encode('utf-8')  # terminal encoding is utf-8
à
>>> print u'à'.encode('latin1') # it cannot understand the latin1 byte
�

ただし str を使うと、特定のエンコーディング表現のシングルバイトをより低いレベルで制御することができます。 unicode を使うと、コードポイントレベルでのみ制御が可能です。例えば、次のようなことができます。

>>> 'àèìòù'
'\xc3\xa0\xc3\xa8\xc3\xac\xc3\xb2\xc3\xb9'
>>> print 'àèìòù'.replace('\xa8', '')
à�ìòù

以前は有効なUTF-8であったものが、今はそうではありません。ユニコード文字列を使用して、結果の文字列が有効なユニコード テキストでないような方法で操作することはできません。 コードポイントを削除したり、コードポイントを別のコードポイントに置き換えたりすることはできますが、内部表現をいじることはできません。