Python 3におけるbytesとstringの相互変換


Markdownを知らなかったときに書いた文章なので、リッチテキストエディタでは脚注の使い方が分からないので、参考資料が孤立しているように見えますが、ご了承ください.
Table of Contents
前言
bytes型データの作成
文字列の作成
そうごへんかん
string to bytes
utf-8で符号化しbytesに変換
gb 2312で符号化しbytesに変換
bytes to string
stringに復号し、デフォルトは記入しません
stringに復号しgb 2312を用いる方式
参考資料

前言


Python 3の最も重要な新しい特性は、テキスト(text)とバイナリデータ(binary data)をより明確に区別していると言えるだろう.(詳細はPython document参照)
  • テキストは常にUnicodeでありstrタイプによって表される.
  • バイナリデータはbytesタイプで表される.

  •  
    ではbytesとは何か、Unicodeとは何か.(参考資料了解及びSO)
  • まずコンピュータが格納できる唯一のものはbytesです.コンピュータに物を格納するためには、まずそれを符号化(encode)、例えばbytesに変換しなければなりません.例えば:
  • 音楽を保存するには、まずMP 3、WAVなどで
  • をコードしなければなりません.
  • 画像を保存するには、まずPNG、JPEGなどで
  • を符号化しなければなりません.
  • テキストを保存するには、まずASCII、UTF-8などで
  • を符号化しなければなりません.
  • Unicodeは文字セットであり、文字コードではありません.Unicodeは世界中の文字を集めて番号付けしたが、具体的な符号化ルールは規定されていない.符号化ルールはUTF-8、GBKなどがあります.

  •  
    Python 3はstrとbytesを任意に暗黙的に混用しない.これにより、両者の区別が特に明確になり、文字列とバイトパケットをつなぎ合わせることができず、バイトパケット内で文字列を検索することもできず(逆も同様)、パラメータがバイトパケットの関数に文字列を転送することもできません(逆も同様です).
     

    bytes型データの作成


    Python 3の内蔵関数bytes関数を使用します.
    class bytes([source[, encoding[, errors]]])

     
    >>> bytes([1,2,3,4,5,6,7,8,9])
    b'\x01\x02\x03\x04\x05\x06\x07\x08\t'
    
    >>> bytes("python", 'ascii') #  , 
    b'python'

     

    文字列の作成

    >>> website = 'http://www.jb51.net/'
    >>> type(website)
    
    >>> website
    'http://www.jb51.net/'

     

    そうごへんかん


    与えられたSOリンクをよく見ると、stringをbytesに変換するにはまず符号化(encode)が必要であり、encodeは多くの異なるencodingsを使用することができる(参考資料Standard Encodings).bytesをstringに変換するには復号(decode)が必要であり、復号のencodingsはデータの実際の符号化状況に応じて設定する必要があることが多い.

    string to bytes


    utf-8で符号化しbytesに変換

    >>> website_bytes_utf8 = website.encode(encoding="utf-8")
    >>> type(website_bytes_utf8)
    
    >>> website_bytes_utf8
    b'http://www.jb51.net/'

     

    gb 2312で符号化しbytesに変換

    >>> website_bytes_gb2312 = website.encode(encoding="gb2312")
    >>> type(website_bytes_gb2312)
    
    >>> website_bytes_gb2312
    b'http://www.jb51.net/'

    bytes to string


    stringに復号し、デフォルトは記入しません

    >>> website_string = website_bytes_utf8.decode()
    >>> type(website_string)
    
    >>> website_string
    'http://www.jb51.net/'

     

    stringに復号しgb 2312を用いる方式

    >>> website_string_gb2312 = website_bytes_gb2312.decode("gb2312")
    >>> type(website_string_gb2312)
    
    >>> website_string_gb2312
    'http://www.jb51.net/'

     

    参考資料


    http://www.jb51.net/article/105064.htm(元の文章はこれを回していたのですが、1年後の私はこの文章を見て本当に水のものはこれ以上水にならないと思って、外鎖さえなくて、その時どうしてあの文章を回したのか分からないので、本文はまた改めました)
    UnicodeとUTF-8の違いは何ですか?
    Text Vs. Data Instead Of Unicode Vs. 8-bit
    What is the difference between a string and a byte string?
    Standard Encodings