Part6:文字列型

絵里「今回は文字列の解説をするわね」
絵里「Pythonの文字列には文字列型(str)とUnicode型(unicode)の2つがあるの」
真姫「文字列って、何でも同じに見えるけど」
絵里「文字コードが関わるといろいろ複雑でね・・・同じ文字列を表すにも内部的なデータの持ち方が違うというか。たとえば」

ハラショー

絵里「これは文字列型では」

\x83n\x83\x89\x83V\x83\x87\x81[

絵里「Unicode型では」

\u30cf\u30e9\u30b7\u30e7\u30fc

絵里「みたいに、同じハラショーでも文字列型とUnicode型では中身が違うの」
にこ「なんか暗号みたいにこ」
絵里「文字列型は英語圏の文字を想定しているから、1バイト文字の並びになっているの。日本語は文字の種類が英語圏よりはるかに多いから、1文字を2バイト以上の組合せで表現するわ」
真姫「\x83nが1バイト?」
絵里「そうね。だからハは\x83n\x83で2バイト」
にこ「じゃ、Unicodeは?」
絵里「Unicodeは世界中の文字を表現できるように策定された規格だから、バイトの考え方は関係ないの。\u30cfが1文字でハになるわ」
にこ「Unicode使えば楽なんじゃないの?」
絵里「Python3ではUnicodeで統一になってるみたいだけど、Python2は歴史的な経緯もあって併用が多いわね」

絵里「いきなり中身の話になっちゃったけど・・・Pythonで文字列を書く場合は、シングルクォートかダブルクォートで括るの」

真姫「・・・イミワカンナイ」
絵里「諸説あるけど、シングルクォート使うのが一般的みたい」
にこ「じゃ、ダブルクォートって何に使うの?」
絵里「シングルクォートの中にシングルクォートは書けないし、ダブルクォートも同じだから、たとえばμ’sって書く場合はどうする?」
真姫「"μ's"って書けばいいの?」
絵里「ハラショー! さすが真姫ね」
真姫「ま、当然よね」
にこ「ぐぬぬ」
絵里「もう一つ、'μ\'s'って書き方もあるわ。\を付けると特殊な文字をただの文字として扱えるの」

絵里「Unicode文字列を書く場合も簡単よ」

絵里「頭にuを付けるだけでUnicode文字列として扱われるわ」

絵里「文字列に対してはいろんな操作ができるけど、一番ありがちなのは連結ね」

にこ「・・・ちょっと」
真姫「何勝手にくっつけてるのよ」
絵里「あら?既成事実じゃないの?」
真姫「な、何言ってるの!? バッカみたい! イミワカンナイ!」
絵里「はいはい♡」

絵里「分割とか切り出しもできるわよ」

にこ「・・・」
真姫「・・・」
絵里「あらあら♡」

絵里「[n]を付けると、n番目の文字にアクセスできるの。[n:m]を使うとn文字目からm-1文字目。nを省略すると文字列の先頭から、mを省略すると文字列の末尾までになるわ。この操作はスライスと呼ぶの」
真姫「えーと、'nicomaki'[0]がnってことは、0から数えればいいのね?」
絵里「そうね。Pythonで何か数えるときは0から数えておけば大体間違いないわ」
絵里「そうそう、文字列(str)型では正確には文字数じゃなくてバイト数指定なの。マルチバイト文字を含む文字列をスライスする場合は気を付けてね」

絵里「文字列には便利な操作がいろいろあるの。全部は無理だけど、いくつか紹介するわね」
絵里「まずは、特定の文字の出現回数を数えるcount

絵里「文字列を分割するsplit

絵里「splitの結果はリストね。リストについては、きっとこの後真姫が」
真姫「準備してるわ。任せて」

絵里「文字列の一部を置換するreplace

にこ「その1文に深い闇を感じるのはにこだけかしら」
真姫「ことりって、実は結構アレよね・・・」

絵里「文字列フォーマット操作というのがあってね、定型文作るのに向いた機能よ」

絵里「%sのところに、後から指定した文字列が埋め込まれるの」
にこ「長いテンプレ紹介文で名前だけ変えるとかが楽になりそうね」

真姫「ねえ絵里、こうやってみたんだけど・・・

真姫「そうしたら・・・」

絵里「これがPythonの文字列処理のはまりどころよ」
絵里「この場合、'こと'u'うみ'で型が違うから、文字列型、この場合UTF-8の'こと'をUnicodeに変換しようとしているの」
真姫「型を揃えてから結合するわけね」
絵里「なんだけど、暗黙の変換だとasciiコードで変換かけようとしちゃうのよね」
真姫「それで失敗してるっていうこと?」
絵里「シングルバイト文字用のasciiじゃ日本語は扱えないもの」
真姫「ってことは、明示的に変換してあげないといけないの?」
絵里「そうね。ここが面倒なところなんだけど・・・」

絵里「このどちらかで結合できるわ」
にこ「encodedecode?」
絵里「Pythonの内部文字コードはUnicodeなの。UTF-8とかCP932とかはそれをエンコードした表現形式。だから、UTF-8をUnicodeに戻してやるのがdecodeで、UnicodeからUTF-8にエンコードするのがencode、ってわけ」
にこ「分かったのか分かってないのか分からないにこ」
絵里「まあ、慣れもあるわよ。最初からどちらかに統一して使っていれば問題も少ないんだけど、外部のライブラリとか使い始めるとそうもいかないのよね」
にこ「とりあえず、真姫ちゃんはことうみ派ということは分かったにこ☆」
真姫「ちょ、それはちょっと前にサンプルが出てきたから・・・」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です