[解決済み] Pythonのstr型とunicode型
質問
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であったものが、今はそうではありません。ユニコード文字列を使用して、結果の文字列が有効なユニコード テキストでないような方法で操作することはできません。 コードポイントを削除したり、コードポイントを別のコードポイントに置き換えたりすることはできますが、内部表現をいじることはできません。
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] Pythonで文字列を小文字にするには?
-
[解決済み] PythonでUnicode(UTF-8)のファイル読み書きをする。
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複