ホームページ  >  記事  >  バックエンド開発  >  文字エンコーディングの難しい問題に対する Python3 の解決策の詳細な説明

文字エンコーディングの難しい問題に対する Python3 の解決策の詳細な説明

PHPz
PHPzオリジナル
2017-04-02 13:23:491463ブラウズ

Python3 の最も重要な改善点の 1 つは、Python2 の strings と文字エンコーディングによって残された大きな穴を解決することです。 Python コーディングはなぜそれほど苦痛なのでしょうか? Python2 の文字列設計にいくつかの欠陥が導入されました:
- デフォルトのエンコード方法として ASCII コードを使用することは、中国語の処理には非常に不向きです。
- 文字列を Unicode と str の 2 つのタイプに分類するという突飛な分類は、開発者に誤解を与えます

もちろん、これはバグではありません。処理時に注意を払う限り、これらの落とし穴は回避できます。しかし、Python3 では両方の問題が非常にうまく解決されます。

まず第一に、Python3 はシステムのデフォルトのエンコーディングを UTF-8 に設定します

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>

その後、テキスト文字とバイナリデータがより明確に区別され、それぞれ str と bytes で表されます。すべてのテキスト文字は str 型で表されます。str は Unicode 文字セット のすべての文字を表すことができますが、バイナリ バイト データは bytes で表される新しい データ型 で表されます。

str

>>> a = "a"
>>> a
'a'
>>> type(a)
<class &#39;str&#39;>
>>> b = "禅"
>>> b
&#39;禅&#39;
>>> type(b)
<class &#39;str&#39;>

bytes

Python3 では、文字引用符の前に 'b' を追加すると、これがバイト型の

オブジェクト であることを明確に示します。実際には、バイナリ バイト シーケンスで構成されるデータのセットです。 bytes 型は、ASCII 範囲の文字およびその他の 16 進形式の文字データですが、中国語などの非 ASCII 文字では表現できません。

>>> c = b&#39;a&#39;>>> c
b&#39;a&#39;>>> type(c)
<class &#39;bytes&#39;>

>>> d = b&#39;\xe7\xa6\x85&#39;>>> d
b&#39;\xe7\xa6\x85&#39;>>> type(d)
<class &#39;bytes&#39;>
>>>

>>> e = b&#39;禅&#39;
  File "<stdin>", line 1SyntaxError: bytes can only contain ASCII literal characters.

bytes 型は str と同じ操作を提供し、シャーディング、インデックス付け、基本的な数値操作などの操作をサポートします。ただし、 + 演算は、py2 では実行可能ですが、str 型および bytes 型のデータに対しては実行できません。

>>> b"a"+b"c"
b&#39;ac&#39;
>>> b"a"*2
b&#39;aa&#39;
>>> b"abcdef\xd6"[1:]
b&#39;bcdef\xd6&#39;
>>> b"abcdef\xd6"[-1]
214
>>> b"a" + "b"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can&#39;t concat bytes to str

エンコードとデコード

str と bytes の間の変換は、encode メソッドと decode メソッドを使用して実行できます。


encode は文字からバイトへのエンコード変換を担当します。デフォルトでは、UTF-8 エンコードが使用されます。

>>> s = "Python之禅"
>>> s.encode()
b&#39;Python\xe4\xb9\x8b\xe7\xa6\x85&#39;
>>> s.encode("gbk")
b&#39;Python\xd6\xae\xec\xf8&#39;

decode は、バイトをデコードして文字に変換する役割を果たし、通常、変換には UTF-8 エンコード形式を使用します。

りー

以上が文字エンコーディングの難しい問題に対する Python3 の解決策の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。