Pythonの文字列符号化

3266 ワード

unicodeとstrタイプ
Pythonの文字列には2つの書き方があります.例えば、「中国」という文字列を変数に割り当てると、次のように書くことができます.
 
str = '  '

または
 
str = u'  '

前者は文字列を定義し、後者はunicode符号化文字列を定義する.
まず第二の形式についてお話しします.Pythonでは、異なる符号化された文字列の表現を統一するとともに、文字列の処理を簡略化するために、その内部に統一化されたテキストタイプunicode、すなわち第2の形式の文字列が提供される.unicodeタイプの文字列はテキストのみを処理し、テキストをunicode形式で内部に格納します.unicodeタイプの役割は,外部テキストの具体的なフォーマットにかかわらず,コード内部文字列の処理にのみ用いられ,テキストの抽象的な表現と見なすことができる.
しかし、実際には外部テキストの異なる符号化フォーマットが多い.例えば、utf-8の符号化またはgbkの符号化が要求される可能性があり、異なる符号化タイプの内容が異なるため、プログラム内部の文字列を外部とインタラクティブな符号化(utf-8、ascii、gdbなど)に変換する必要がある.通常strタイプを使用して操作します.厳密にはstrは必ずしもテキストではなく、バイナリの内容である可能性もあり、バイトの組合せ(unicodeタイプはunicode文字である組合せ)を提供しているが、strの中でちょうど何らかの形式で符号化されたテキストであれば、本文処理(printなど)とすることができる.
Pythonのコマンドラインで次のコードを実行することで、2つのフォーマットの違いを見ることができます.
strの場合:
>>> str = '  ';
>>> for c in str:
...     c
... <  >

  :
'\xe4'
'\xb8'
'\xad'
'\xe5'
'\x9b'
'\xbd'

unicodeの場合:
>>> str = u'  '
>>> for c in str:
...     c
... <  >

  :
u'\u4e2d'
u'\u56fd'

前者は6行を出力し,後者は2行のみを出力した.これは、文字列に対する2つのタイプの異なる理解によるものです.前者は文字列をバイトの組合せと理解し、システムがutf-8符号化をデフォルトで採用しているため、文字列「中国」は実は4バイトの組合せである.後者は文字列をテキスト文字の組合せと理解し、u'中国'は「中」と「国」の2文字のunicodeコードの組合せと見なされる.
コード変換
  • unicodeとstrの変換
  • encodeメソッドを使用してunicode文字列をstr文字列に符号化します.
    >>> unicode_str = u'  '
    >>> unicode_str
    u'\u4e2d\u56fd'
    >>> utf8_str = unicode.encode('utf-8');
    >>> utf8_str
    '\xe4\xb8\xad\xe5\x9b\xbd'

    decodeメソッドを使用してstrをunicodeに変換します.
    >>> utf8_str = '  '
    >>> utf8_str
    '\xe4\xb8\xad\xe5\x9b\xbd'
    >>> unicode_str = utf8_str.decode('utf-8')
    >>> unicode_str
    u'\u4e2d\u56fd'

    encodeまたはdecodeの場合、str文字列の符号化を指定するために手動で符号化方式を入力する必要があります.
     
  • 異なる符号化の変換
  • ある符号化方式でデータソースからテキストを取得し、別の符号化方式で別のデータソースに保存する必要がある場合があります.unicodeを中間変数として変換できます.
    >>> utf8_str = '  '
    >>> utf8_str
    '\xe4\xb8\xad\xe5\x9b\xbd'
    >>> unicode_str = utf8_str.decode('utf-8')
    >>> gbk_str = unicode_str.encode('gbk')
    >>> gbk_str
    '\xd6\xd0\xb9\xfa'

    gbkは漢字を2バイトで保存するため,変換後は合計4バイトである.
     
    コード検出
    時々、文字列が何の符号化なのか分からないかもしれませんが、chardetツールは未知の符号化文字列の符号化フォーマットを検出するのに役立ちます.
    まずchardetをshellにインストールします.
     
    $ sudo easy_install chardet

    インストールが完了したら使用できます.Pythonコマンドラインに入ります.
     
    >>> import chardet
    >>> str = '  '
    >>> chardet.detect(str)
    {'confidence': 0.7525, 'encoding': 'utf-8'}

    結果的にencodingは推測の符号化であり、confidenceは信頼性であり、その後どのように処理するかはあなた次第です.