デカ文字Python

デカ文字&短文でPythonを簡潔にまとめたブログ

Python-bytes型(UTF-8について)

バイト型を扱えるようになると、文字列の操作の幅が広がる。

例えば平仮名を"あいうえお"順に出力する等の処理ができるようになる。

 

def kana():
i = 0
char = "".encode("UTF-8")
char = list(char)

while i < 85:
yield bytes(char).decode("UTF-8")
char[-1] = char[-1] + 1

if char[-1] >=192:
char[-2]=char[-2]+1
char[-1]=128

i += 1


for v in kana():
print(v, end="")

>>>あぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ

 

これはぜひとも学びたい

 

文字コード

 

バイト型(bytes)はバイト列を扱うための型です。

 

バイト型?

 

コンピューターは2進数で動作するため、全てのデータはつきつめるとバイト列にたどり着きます。数字で言えば、0は0、1は1、2は01というように。

 

これは文字列についても同様のことが言えます。

ただし、文字列と言っても、アルファベットから平仮名、漢字、キリル文字…ect.と様々あるため、その表現は容易ではありません。

そのため、どのバイト表現(0と1の羅列)がどの文字列と対応するか、という変換表ともいうべき対応式を文字コードといいます。

 

文字コードAでは”あ”は010101110111だけど、
文字コードBでは"あ"は011011010111みたいなことだね。

 

その文字コードのなかでも、最も基礎的なのがASCIIコードです。

ASCIIコード

  1. American Standard Code for Information Interchangeの略。
  2. 最も基本的な文字コード
  3. その他多くの文字コードでも前半0~127通りで採用されている。
  4. 1960年代に開発。
  5. 7bits(2**7、つまり128通り)で表された全128文字を収録したコード。
  6. "1", "a","A",といった図形文字以外にも、改行やtabを表す制御文字も表す。

対応表は以下の図。(黄色に該当するところが制御文字です。)

上位3ビット→
↓下位4ビット
0 1 2 3 4 5 6 7
0 NUL DLE SP 0 @ P ` p
1 SOH DC1 ! 1 A Q a q
2 STX DC2 " 2 B R b r
3 ETX DC3 # 3 C S c s
4 EOT DC4 $ 4 D T d t
5 ENQ NAC % 5 E U e u
6 ACK SYN & 6 F V f v
7 BEL ETB ' 7 G W g w
8 BS CAN ( 8 H X h x
9 HT EM ) 9 I Y i y
A LF/NL SUB * : J Z j z
B VT ESC + ; K [ k {
C FF FS , < L \ (¥ ) l |
D CR GS - = M ] m }
E SO RS . > N ^ n
F SI US / ? O _ o DEL

Unicode

  1. Unicodeの「Uni」は、「統一」という意味。
  2. ローマ字から少数民族の文字に至るまで、世界で使われているすべての文字を共通の文字集合で利用できるように考えられたもの。
  3. 全部で2**16×17の21ビット(約3バイト)の文字たちを含んでいる。
  4. その文字たちをどういうルールでバイト表現に対応させるか(文字符号化方式)、についてはたくさんの対応表がある。

UTF-8

 対応表は以下の通り。0~127まではASCIIコード同様である。

 

  0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
10 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
20   ! " # $ % & ' ( ) * + , - . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
50 P Q R S T U V W X Y Z [ \ ] ^ _
60 ` a b c d e f g h i j k l m n o
70 p q r s t u v w x y z { | } ~ DEL

~~~~~~~~~~~~~~~~~一部省略~~~~~~~~~~~~~~~~~~

e38180  
e38190
e381a0
e381b0
e38280
e38290    
e382a0
e382b0
e38380
e38390
e383a0
e383b0
e38480          
e38490
e384a0  

 

1文字が必ず1バイト(x0--)に対応するASCIIと異なり、
UTF-8は1文字が1~3バイトに対応する。

上の図だと、ASCII対応部分は[00-7F]の1バイトで表現されるが、ひらがな対応部分だと[E3][81-82][80-9F]の3バイトになっている。

 

こうした、1文字に複数バイトが対応する文字コードのことを、マルチバイト文字と呼ぶ。

 

マルチバイト文字は、バイトだけで見て「これは何文字だ」って一意に決まるの?
※b"\x61\x61\x61"=3文字の"aaa" or
 b"\x61\x61\x61"="a"と2バイト文字b"\x61\x61" or
 b"\x61\x61\x61"=3バイト文字b"\x61\x61\x61"

 

UTF-8は接頭符号。そのため、 バイト列をどこで切っても、そのバイトを他の文字の先頭バイトと間違えることはない。先頭バイトと後続バイトの領域がはっきり区別されている。
文字種 表現
ASCII文字 [00-7F]
ラテン文字など [C0-DF][80-BF]
ひらがな・カタカナ・漢字など [E0-EF][80-BF][80-BF]
一部の漢字・絵文字など [F0-F7][80-BF][80-BF][80-BF
 次回につづきます。