python2とpython3の文字型とwindowにおける文字列エンコードのふるまい
初回公開:2018/11/17
最終更新:未
【 目次 】
pythonの文字列については以下でも述べているが
今回は文字コードの扱いについて、いまさらながら再復習。
バイト文字列とユニコード文字列
バイト文字列(バイト列)の指定は頭にbを,ユニコード文字列はuを付ける。
バイト文字列という呼び方はpython2の場合で、python3ではバイト列と呼ぶ。
python2
python2の場合、str型はバイト文字列を示し,Unicode型はユニコード文字列を表す。
そして、標準の文字列(頭にuもbも付けない文字列)はバイト文字列となる。
# -*- coding: shift_jis -*- x_str="あいう" b_str=b"あいう" u_str=u"あいう" print(b_str,type(b_str)) print(u_str,type(u_str)) print(x_str,type(x_str)) print b_str,u_str,x_str
実行結果
('\x82\xa0\x82\xa2\x82\xa4',) (u'\u3042\u3044\u3046', ) ('\x82\xa0\x82\xa2\x82\xa4', ) あいう あいう あいう
この時、バイト文字列に格納される文字コードはshift-jisという事になる。
当サイトの実行結果はすべてwindows-osでの実行した結果なので、他のosで実行した場合は異なる結果になるかもしれない。
注記
ソースファイルの文字コードにshift-jisを指定されている事に注意。
python3
python3の場合、通常の文字列型strはユニコード文字列を指す。
バイト文字列に相当するものとしてバイト列bytes型が定義されている。
バイト列には通常の方法ではASCII文字以外(全角文字,半角文字でもカタカナ等もダメ)を代入できない。
エラーになってしまう。
b_str=b"あいう"
実行結果
SyntaxError: bytes can only contain ASCII literal characters.
しかたがないので、ASCIIの文字列を使って上記と同様のサンプルコードを書くと。
# -*- coding: shift_jis -*- b_str=b"abc" u_str=u"あいう" x_str="あいう" print((b_str,type(b_str))) print((u_str,type(u_str))) print((x_str,type(x_str))) print(b_str,u_str,x_str)
実行結果
(b'abc', <class 'bytes'>) ('あいう', <class 'str'>) ('あいう', <class 'str'>) b'abc' あいう あいう
print文の出力形式もpython2とだいぶ異なった結果となってしまう。
バイト列に非ASCIIコード文字列を格納できないのは何かと都合が悪い。
そこで、ユニーコード文字列のencodeメソッドを使うとバイト文字列への非ASCIIコード文字列の格納が可能になる。(encodeメソッドについては後述)
b_str="あいう".encode('shift-jis') print(b_str,type(b_str))
実行結果
b'\x82\xa0\x82\xa2\x82\xa4' <class 'bytes'>
そして、print関数でコンソールに表示されるバイト文字列はバイナリーコードで表示される事になる。
encodeメソッドはユニーコード文字列をどの文字列に変換するかの指定が必要で、上記のコードではencodeメソッドの引数にshift-jisを指定しているが、utf-8を指定した場合はもちろんutf-8のバイナリーコードとして格納される。
b_str="あいう".encode('utf-8') print(b_str,type(b_str))
実行結果
b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86', <class 'bytes'>
文字列リテラル
python3
前項では非ASCIIコード文字列をバイト列に格納するためにencodeメソッドを用いたが、
128 以上の数値を持つバイト(非ASCIIコード文字列)はエスケープして表すことができる。
文字列およびバイト列リテラル
b_str=b"\x82\xa0\x82\xa2\x82\xa4" print(b_str,type(b_str)) print(b_str.decode("shift-jis"))
実行結果
b'\x82\xa0\x82\xa2\x82\xa4' <class 'bytes'> あいう
python2
文字列リテラル
b_str="\x82\xa0\x82\xa2\x82\xa4" print b_str,type(b_str)
実行結果
あいう <type 'str'>
配列要素としての扱い
python2のバイト文字列str型に相当するのがpython3のバイト列bytes型。
しかし、python2のバイト文字列str型がutf-8やshift-jisにエンコードされた文字列を扱うという位置付けなのに対して、バイト列bytes型は文字どうりバイナリな配列を扱うという位置付けになるようだ。
そしてバイナリな配列の内にエンコードされた文字列も含まれるという事になるようだ。
python2のバイト文字列とpython3のバイト列の配列要素の違いをみてみるとバイト文字列の要素はstr型であるに対してバイト列の場合はint型になる。
これらの違いを、配列要素を16進文字列で表示するプログラムで比較してみると
python2
# バイト列の配列要素を表示 b_str=b"\x82\xa0\x82\xa2\x82\xa4" print b_str[0],type(b_str[0]) for c in b_str: print hex(ord(c)) # ユニコード文字列の配列要素を表示 u_str=u"あいう" print u_str[0],type(u_str[0]) for c in u_str: print(hex(ord(c)))
実行結果
・<type 'str'> 0x82 0xa0 0x82 0xa2 0x82 0xa4 あ <type 'unicode'> 0x3042 0x3044 0x3046
python3
# バイト列の配列要素を表示 b_str=b"\x82\xa0\x82\xa2\x82\xa4" print(b_str[0],type(b_str[0])) for i in b_str: print(hex(i)) # ユニコード文字列の配列要素を表示 u_str=u"あいう" print(u_str[0],type(u_str[0])) for i in u_str: print(hex(ord(i)))
実行結果
130 <class 'int'> 0x82 0xa0 0x82 0xa2 0x82 0xa4 あ <class 'str'> 0x3042 0x3044 0x3046
ユニコード文字列やpython2のバイト文字列の要素がstr型となるためord関数を使っていったんint型に変換する必要がある。
python3のbytes型とbytearray型はバイト要素を持つリストやタプルから生成可能。
# リストからbytesオブジェクト,bytearrayオブジェクトを生成 b_list=[0x82,0xa0,0x82,0xa2,0x82,0xa4] b_str=bytes(b_list) print(b_str,type(b_str),b_str.decode("shift-jis")) b_ary=bytearray(b_list) print(b_ary,type(b_ary),b_ary.decode("shift-jis")) # タプルからbytesオブジェクト,bytearrayオブジェクトを生成 b_tpl=(0x82,0xa0,0x82,0xa2,0x82,0xa4) b_str=bytes(b_tpl) print(b_str,type(b_str),b_str.decode("shift-jis")) b_ary=bytearray(b_tpl) print(b_ary,type(b_ary),b_ary.decode("shift-jis"))
実行結果
b'\x82\xa0\x82\xa2\x82\xa4' <class 'bytes'> あいう bytearray(b'\x82\xa0\x82\xa2\x82\xa4') <class 'bytearray'> あいう b'\x82\xa0\x82\xa2\x82\xa4' <class 'bytes'> あいう bytearray(b'\x82\xa0\x82\xa2\x82\xa4') <class 'bytearray'> あいう
そしてpython2のbytearray型もバイト要素を持つリストやタプルから生成可能。
配列要素を操作する関数
文字列の配列要素を操作するために有用と思われる関数をピックアップしてみる。
ord関数 - 文字を数値に変換
chr関数 - 数値を文字に変換
-
Python 2 と Python 3 のユニコード文字列、バイト列の違いメモ - 銀月の符号
Python 2.6 の bytes は str のエイリアスにすぎない。なので bytes([i]) とかいても Python 3 と同じ動作はしない。
...
chr 関数が返すものが Python 2 と Python 3 で変わっている。というか Python 2 の chr が削除され、 unichr が chr に名前を変えられたというべきなのか。 -
2. 組み込み関数 — Python 2.7.15 ドキュメント
ASCII コードが整数 i となるような文字 1 字からなる文字列を返します。
…
引数の有効な範囲は 0 から 1,114,111 (16 進数で 0x10FFFF) です。 - 組み込み関数 — Python 3.7.1 ドキュメント
Unicode コードポイントが整数 i である文字を表す文字列を返します。
…
引数は [0..255] の両端を含む範囲内に収まらなければなりません
unichr関数 - 数値をユニコード文字に変換(python2のみ)
- 2. 組み込み関数 — Python 2.7.15 ドキュメント
Unicode におけるコードが整数 i になるような文字 1 文字からなる Unicode 文字列を返します。
hex関数 - 数値を16進文字列に変換
python3のbytes型とbytearray型のfromhexクラスメソッドとhexインスタンスメソッド
16進文字列と文字列の変換については他にも
len関数 - 文字列の長さ(配列の要素数)を返す
ソースファイルの文字コードによる動作の違い
これまでの例ではソースファイルの文字コードにすべてshift-jisを指定しているが、utf-8で記述されたソースファイルの場合に出力結果に違いがあるのだろうか?
python2
# -*- coding: utf-8 -*- b_str=b"あいう" u_str=u"あいう" x_str="あいう" print(b_str,type(b_str)) print(u_str,type(u_str)) print(x_str,type(x_str)) print b_str,u_str,x_str
utf-8で保存された上記のコードの実行結果は
実行結果
('\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86', <type 'str'>) (u'\u3042\u3044\u3046', <type 'unicode'>) ('\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86', <type 'str'>) 縺ゅ>縺・あいう 縺ゅ>縺
驚く事にバイト文字列b_strに格納される文字コードはutf-8形式となっている。
つまり、ソースファイルの文字コードによってバイト文字列に格納される文字コードが異なるという事になる。
しかもバイト文字列に自身がどの文字コードでエンコードされた文字列を格納しているかという情報を持っていない。
従って、バイト文字列がどの文字コードでエンコードされているかをプログラマーが意識する必要がある。
このままこれをdosのコンソールに出力すると文字化けをおこしてしまう。
これはutf-8で保存されたソースファイル内で、バイト文字列に文字列を格納するとバイト文字列にはそのソースコードの文字コードのバイナリ形式で格納されてしまうためのようだ。
或る意味当然と言えば当然だが知らないと困惑してしまう。
ではutf-8で保存されたソースファイルのバイト文字列をdosのコンソールに文字化けせずに出力するにはどうしたらよいのだろうか?
これについては次のencodeメソッドとdecodeメソッドの項で調べてみる事にする。
開発環境による違い
dos窓とは異なりeclipseのコンソールは特殊なようで、ソースファイルをshift-jisにしてもutf-8にしても文字化けは起こらない。(pleiades-4.7.3-python-win-64bit-jre_20180411にて確認) でも時々、動作が不安定。
shift-jisの実行結果
('\x82\xa0\x82\xa2\x82\xa4', <type 'str'>) (u'\u3042\u3044\u3046', <type 'unicode'>) ('\x82\xa0\x82\xa2\x82\xa4', <type 'str'>) あいう あいう あいう
utf-8の実行結果
('\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86', <type 'str'>) (u'\u3042\u3044\u3046', <type 'unicode'>) ('\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86', <type 'str'>) あいう あいう あいう
python3
前述のように、python3の場合もともと非ASCII文字列をバイト列に格納するには文字列をエスケープする必要がある。
エスケープ文字列は16進数表記でありソースコードの文字コードとは無関係。
ソースファイルに記述されたエスケープされていない文字列を変数に格納するにはstr型(ユニコード文字列)に代入するしかない。
ソースファイルがsift-jisで記述されていようとutf-8で記述されていようとunicode文字列に変換して変数に格納されるので、これもソースファイルの文字コードとは無関係。
python3では、ソースファイルの文字コードによる影響,動作の違いは生じないようだ。
encodeメソッドとdecodeメソッド
文字コードの変換にはencodeメソッドとdecodeメソッドがもちいられる。
エンコード デコード とは
そもそも エンコード デコード とは
-
情報を符号化することをエンコードと呼び
それとは逆に符号化されたデーターを下に戻すことをデコードと呼びます。
エンコードやデコードをするプログラムのことをコーデックと呼びます。 -
「エンコード」と「デコード」の違い|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
似ているところ
どちらも、データの形式を変換する行為を指す用語です。
違うところ
変換の向きが違います。
エンコードは
元のデータ → 変換後のデータ
です。
元のデータがあって、それを別の形式に変換する行為を指します。
元のデータというのは文字コードの場合何を指すのだろうか? unicode形式をさしているのだろうか?
python2
公式ドキュメントのencodeメソッドとdecodeメソッド
encodeメソッド
- str.encode([encoding[, errors]])
- 文字列のエンコードされたバージョンを返します。
デフォルトのエンコーディングは現在の文字列エンコーディングのデフォルトです。
decodeメソッド
- str.decode([encoding[, errors]])
- codec に登録された文字コード系 encoding を使って文字列をデコードします。
encoding は標準でデフォルトの文字列エンコーディングになります。
python2のencodeメソッドとdecodeメソッドの例を以下に示す。
u_str=u"あいう" x_str=u_str.encode("shift-jis") print x_str,type(x_str) x_str2=x_str.decode("shift-jis") print x_str2,type(x_str2)
実行結果
あいう <type 'str'> あいう <type 'unicode'>
上記の結果より、
ユニコード文字列をエンコードするとバイト文字列str型に変換される。
そしてバイト文字列str型をデコードするとユニコード文字列に戻す事ができる。
encodeメソッドはユニコード文字列をバイト文字列に,decodeメソッドはバイト文字列をユニコード文字列に変換
エンコードとデコード元のデータというのはユニコード文字列を指し、unicode型のencodeメソッドを使う事で引数で指定された文字コードのバイト列(バイト文字列)に変換する事ができる。
また逆に、str型のdecodeメソッドによりバイト文字列をユニコード文字列に変換する事ができる。
ここでバイト文字列は自身の文字コードが何かの情報を持たないのでdecodeメソッドの引数としてどの文字コードなのかを指定する必要がある。
- Python2のstr/unicodeとencode/decode - Qiita
unicode文字列に対してencode()メソッドを呼び出すとstr文字列が得られる
str文字列に対してdecode()メソッドを呼び出すとunicode文字列が得られる
これは間違っていないが、実はstr文字列にも encode() メソッドが存在し、またunicode文字列にも decode() メソッドが存在する。
python2にはstr型とunicode型の両方でencodeメソッドとdecodeメソッドが使用できるようだが、情報を符号化するのがエンコードで、それを元のデータに戻すのがデコードという意味で考えると、str型のdecodeメソッドやunicode型のdecodeメソッドは何のための操作をするメソッドか意味不明でプログラマーを混乱させるだけの必要の無いメソッドに思われる。
実際、python3には(python2のstr型に相当する)bytes型のdecodeメソッドや(python2のunicode型に相当する)str型のdecodeメソッドは存在しない。
python2のデフォルトの文字列エンコーディングはASCII
どの文字コードに変換するかをencodeメソッドの引数として与えてやる必要がある事は既に述べたが、encodeメソッドの引数を省略すると非アスキーコードの文字列はエラーとなってしまう。
b_str=u"あいう".encode()
実行結果
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
同様に、非アスキーコードの文字列にdecodeメソッドの引数を省略するとエラーとなってしまう。
u_str2=b"あいう".decode()
実行結果
UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 0: ordinal not in range(128)
これは、python2のデフォルトの文字列エンコーディングがASCIIに設定されているためと思われる。
- Unicode HOWTO — Python 2.7.15 ドキュメント
Python デフォルトの ASCII エンコーディングが利用されるため、127より大きい文字列は例外を引き起します:
utf-8にエンコードされたバイト文字列をdos窓で文字化けせずに出力するには
前述のutf-8で保存されたソースファイルのバイト文字列をdos窓で文字化けせずに出力するには、utf-8形式で格納されたバイト文字列をdecodeメソッドやencodeメソッドを使ってユニコード文字列やshift-jis形式に変換して出力してやれば良い事になる。
print b_str.decode("utf-8"),u_str,x_str.decode("utf-8")
実行結果
あいう あいう あいう
python3
encodeメソッド
str.encode(encoding="utf-8", errors="strict")
文字列のエンコードされたバージョンをバイト列オブジェクトとして返します。標準のエンコーディングは 'utf-8' です。標準とは異なるエラー処理を行うために errors を与えることができます。標準のエラー処理は 'strict' で、エンコードに関するエラーは UnicodeError を送出します。他に利用できる値は 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' および関数 codecs.register_error() によって登録された名前です。これについてはセクション エラーハンドラ を参照してください。利用可能なエンコーディングの一覧は、セクション 標準エンコーディング を参照してください。
decodeメソッド
bytes.decode(encoding="utf-8", errors="strict")
bytearray.decode(encoding="utf-8", errors="strict")
与えられたバイト列からデコードされた文字列を返します。デフォルトのエンコーディングは 'utf-8' です。 errors を与えて異なるエラー処理法を設定できます。 errors のデフォルトは 'strict' で、エンコーディングエラーが UnicodeError を送出します。設定できる他の値は、 'ignore' 、 'replace' 、その他の codecs.register_error() を通して登録された名前で、節 エラーハンドラ を参照してください。可能なエンコーディングのリストは、 標準エンコーディング を参照してください。注釈 引数 encoding を str に渡すと bytes-like object を直接デコードすることができます。つまり、一時的な bytes や bytearray オブジェクトを作成する必要はありません。
python3のencodeメソッドとdecodeメソッドの例を以下に示す。
# -*- coding: shift_jis -*- u_str="あいう" x_str=u_str.encode("shift-jis") print(x_str,type(x_str)) x_str2=x_str.decode("shift-jis") print(x_str2,type(x_str2))
実行結果
C:\home\ichi\rd\python\python3> python str1_s.py b'\x82\xa0\x82\xa2\x82\xa4' <class 'bytes'> あいう <class 'str'>
python2と同様、encodeメソッドはユニコード文字列をバイト文字列に,decodeメソッドはバイト文字列をユニコード文字列に変換できる。
python3のデフォルトの文字列エンコーディングはutf-8
上記のコードのencodeメソッドとdecodeメソッドの引数を省略するとutf-8が指定されたとみなされpython2のようなエラーは発生しない。
u_str="あいう" x_str=u_str.encode() print(x_str,type(x_str)) x_str2=x_str.decode() print(x_str2,type(x_str2))
実行結果
b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86' <class 'bytes'> あいう <class 'str'>
Pythonの文字列型
ここでPython2とPython3の文字列型の定義について公式ドキュメントを再認識してみる。
Python2
Python2のバイト文字列はstr型,ユニコード文字列はunicode型となる。
そしてミュータブル(値を変更可能)なバイト文字列(ミュータブルなstr型)としての位置付けとなるのがbytearray型
python mutable
バイト文字列str型
class str(object='')
オブジェクトをうまく印字可能な形に表現したものを含む文字列を返します。文字列に対してはその文字列自体を返します。 repr(object) との違いは、 str(object) は常に eval() が受理できるような文字列を返そうと試みるわけではないという点です; この関数の目的は印字可能な文字列を返すところにあります。引数が与えられなかった場合、空の文字列 '' を返します。文字列についての詳細は、シーケンスの機能についての説明、 シーケンス型 --- str, unicode, list, tuple, bytearray, buffer, xrange を参照下さい(文字列はシーケンスです)。 また、文字列特有のメソッドについては、 文字列メソッド を参照下さい。整形した文字列を出力するためには、テンプレート文字列か、 文字列フォーマット操作 にて説明される % 演算子を使用して下さい。さらには、 文字列処理 と unicode() も参照下さい。
ユニコード文字列unicode型
unicode(object='')
unicode(object[, encoding[, errors]])
以下のモードのうち一つを使って、 object の Unicode 文字列バージョンを返します:もし encoding かつ/または errors が与えられていれば、 unicode() は 8 ビットの文字列または文字列バッファになっているオ ブジェクトを encoding の codec を使ってデコードします。 encoding 引数はエンコーディング名を与える文字列です; 未知のエンコーディングの場合、 LookupError が送出されます。エラー処理は errors に従って行われます; このパラメータは入力エンコーディング中で無効な文字の扱い方を指定します。 errors が 'strict' (標準の設定です) の場合、エラー発生時には ValueError が送出されます。一方、 'ignore' では、エラーは暗黙のうちに無視されるようになり、 'replace' では公式の置換文字、 U+FFFD を使って、デコードできなかった文字を置き換えます。 codecs モジュールについても参照してください。
オプションのパラメータが与えられていない場合、 unicode() は str() の動作をまねます。ただし、8 ビット文字列ではなく、 Unicode 文字列を返します。もっと詳しくいえば、 object が Unicode 文字列かそのサブクラスなら、デコード処理を一切介することなく Unicode 文字列を返すということです。
__unicode__() メソッドを提供しているオブジェクトの場合、 unicode() はこのメソッドを引数なしで呼び出して Unicode 文字列を生成します。それ以外のオブジェクトの場合、 8 ビットの文字列か、オ ブジェクトのデータ表現 (representation) を呼び出し、その後デフォルトエンコーディングで 'strict' モードの codec を使って Unicode 文字列に変換します。
Unicode 文字列についてのさらなる情報については、シーケンス型の機能 についての説明、 シーケンス型 --- str, unicode, list, tuple, bytearray, buffer, xrange を参照下さい(Unicode 文字列はシー ケンスです)。また、文字列特有のメソッドについては、 文字列メソッド を参照下さい。整形した文字列を出力するために は、テンプレート文字列か、 文字列フォーマット操作 にて説明される % 演算子を使用して下さい。さらには、 文字列処理 と str() も参照下さい。
pythonのクラスのコンストラクタは関数の形をしており、組み込みの関数 - str関数,unicode関数という位置付けになる。
そしてクラスのふるまいと特殊属性でも述べたようにobjectを引数に指定した場合、特殊メソッド__str__や__unicode__の結果を返す。
unicodeメソッドには、encoding引数を指定する事もできて、これを使うとdecodeメソッドのようにバイト文字列をユニコード文字列に変換する事もできる。
## -*- coding: utf-8 -*- u_str=unicode(b"あいうえお","utf-8") print u_str,(u_str,type(u_str))
実行結果
あいうえお (u'\u3042\u3044\u3046\u3048\u304a', <type 'unicode'>)
ミュータブルなバイト文字列bytearray型
Pythonのデータ型には、値を変更できない「イミュータブル(immutable)」な型と変更可能な「ミュータブル(mutable)」な型とがある。
前述のバイト文字列str型とユニコード文字列unicode型は「イミュータブル(immutable)」な型に分類される。
それに対してbytearray型はミュータブル(値の変更が可能)なバイト文字列という位置付けになる。
bytearray型
class bytearray([source[, encoding[, errors]]])
新しいバイト配列を返します。 bytearray クラスは0 <= x < 256の範囲の整数からなる mutable なシーケンスです。 ミュータブルなシーケンス型 に記述されている mutable なシーケンスに対する普通のメソッドの大半を備えています。また、 str 型が持つメソッドの大半も備えています(文字列メソッド 参照)。オプションの source パラメタは、配列を異なる方法で初期化するのに使われます:
それが unicode なら、 encoding (と、オプションの errors) パラメタも与えなければなりません。このとき bytearray() は unicode を unicode.encode() でバイトに変換して返します。
これが 整数 なら、配列はそのサイズになり、null バイトで初期化されます。
これが バッファ インタフェースに適合するオブジェクトなら、そのオブジェクトの読み込み専用バッファがバイト配列の初期化に使われます。
これが イテラブル なら、それは範囲 0 <= x < 256 内の整数のイテラブルであることが必要で、それらが配列の初期の内容になります。
引数がなければ、長さ 0 の配列が生成されます。
ミュータブルなシーケンス型
bytearray型とstr型の配列要素にアクセスして違いをみるためのサンプルコードを以下に示す
# -*- coding: shift_jis -*- b_str="あいう" print b_str for i,s in enumerate(b_str) : print i,s,hex(ord(s)),type(s) #s[5]=0xa6 print b_str[5] print b_str # bytearray関数の引数にstr型の値を指定してbytearrayオブジェクトを取得する事ができる。 b_ary=bytearray("あいう") # bytearray関数の引数にunicode型の値とエンコードを指定してbytearrayオブジェクトを取得する事もできる。 b_ary=bytearray(u"あいう","shift-jis") print b_ary for i,elm in enumerate(b_ary) : print i,hex(elm),type(elm) b_ary[5]=0xa6 print b_ary,type(b_ary) # bytearray型はstr型が持つメソッドの大半も備えている。例えばdecodeメソッドも u_str=b_ary.decode("shift-jis") print u_str,type(u_str)
実行結果
あいう 0 ・0x82 <type 'str'> 1 0xa0 <type 'str'> 2 ・0x82 <type 'str'> 3 「 0xa2 <type 'str'> 4 ・0x82 <type 'str'> 5 、 0xa4 <type 'str'> 、 あいう あいう 0 0x82 <type 'int'> 1 0xa0 <type 'int'> 2 0x82 <type 'int'> 3 0xa2 <type 'int'> 4 0x82 <type 'int'> 5 0xa4 <type 'int'> あいえ <type 'bytearray'> あいえ <type 'unicode'>
str型,bytearray型ともに各要素はバイト単位でアクセスする。
str型の各要素はstr型の値となる。
これに対してbytearray型の要素はint型の値となる。
str型の値を整数値に変換するにはord関数が有効。
s[5]=0xa6
のようにstr型の要素に値を代入するとエラーが発生するが
TypeError: 'str' object does not support item assignment
bytearray型の要素の要素に値を代入するb_ary[5]=0xa6
はエラーにならない。
上記のコードのように、bytearray関数の引数にstr型の値を指定してbytearrayオブジェクトを取得する事も、unicode型の値をエンコードしてbytearrayオブジェクトを取得する事もできる。
Python3
Python2のバイト文字列はbytes型,ユニコード文字列はstr型に相当する。
バイト列bytes型
bytes関数
class bytes([source[, encoding[, errors]]])
範囲 0 <= x < 256 の整数のイミュータブルなシーケンスである "bytes" オブジェクトを返します。 bytes は bytearray のイミュータブル版です。オブジェクトを変化させないようなメソッドや、インデクシングやスライシングのふるまいは、これと同様のものです。従って、コンストラクタ引数は bytearray() のものと同様に解釈されます。
バイト列オブジェクトはリテラルでも生成できます。 文字列およびバイト列リテラル を参照してください。
バイナリシーケンス型 --- bytes, bytearray, memoryview, バイトオブジェクト, bytes と bytearray の操作 も参照してください。
bytes型とbytes型で使えるメソッドなど
バイナリシーケンス型 --- bytes, bytearray, memoryview
bytes型とbytearray型ともに、バイトの操作以外に文字列を操作する関数も使う事ができる。
ユニコード文字列str型
str関数
class str(object='')
class str(object=b'', encoding='utf-8', errors='strict')
object の str 版を返します。詳細は str() を参照してください。str は組み込みの文字列 クラス です。文字列に関する一般的な情報は、テキストシーケンス型 --- str を参照してください。
str型とstr型で使えるメソッドなど
テキストシーケンス型 --- str
ミュータブルなバイト列bytearray型
bytearray関数
class bytearray([source[, encoding[, errors]]])
新しいバイト配列を返します。bytearray クラスは0 <= x < 256の範囲の整数からなる変更可能な配列です。ミュータブルなシーケンス型 に記述されている変更可能な配列に対する普通のメソッドの大半を備えています。また、bytes 型が持つメソッドの大半も備えています(see bytes と bytearray の操作)。オプションの source 引数は、配列を異なる方法で初期化するのに使われます:
文字列 の場合、 encoding (と、オプションの errors) 引数も与えなければなりません。このとき bytearray() は文字列を str.encode() でバイトに変換して返します。
整数 の場合、配列はそのサイズになり、null バイトで初期化されます。
バッファ インタフェースに適合するオブジェクトの場合、そのオブジェクトの読み出し専用バッファがバイト配列の初期化に使われます。
イテラブル の場合、範囲 0 <= x < 256 内の整数のイテラブルでなければならず、それらが配列の初期の内容として使われます。
引数がなければ、長さ 0 の配列が生成されます。
bytearray オブジェクト
その他の参考URL
python 文字コード
- Python2とPython3のstr型/unicode型/bytes型/encode/decodeの違い解説
- japaneseCharset - Pythonのお勉強
- Python2で文字列を処理する際の心掛け
- Pythonでの文字コードの取り扱い - たにしきんぐダム
- Python - Wikipedia
- 日本語文字列コード問題まとめ — PythonMatrixJp
bytes-like object
バッファプロトコル (buffer Protocol)
python2にはバッファプロトコルの記載は無いみたい
python mbcs
標準出力の文字列エンコードを変更する方法がいろいろと工夫されているようだが、dos窓の場合はどうすればよいのだろうか? 私にはよくわからない。
- Python2で文字列を処理する際の心掛け - Qiita
- Python3で文字列を処理する際の心掛け - Qiita
- Python でUTF-8, shift_jis, euc_jpなど日本語を使う方法
lc_all=c windows
PYTHONIOENCODING
- 1. コマンドラインと環境 — Python 2.7.15 ドキュメント
stdin/stdout/stderr のエンコーディングを強制します。
シンタックスは encodingname:errorhandler です。
:errorhandler の部分はオプションで、 str.encode() の引数と同じ意味です。
msdos powershell ユニコード