2021-03-30に投稿

Python 標準ライブラリ unicodedata Unicodeデータベース

Pythonの標準のUnicodeに関するデータベースにアクセスできるunicodedataモジュールについて解説します。

概要

文字に関するユニコードの情報にアクセスできる各種関数が用意されています。
引数defaultをオプションとして使用すると、返却値が定義されていない場合その値が返却されます
(引数未指定の場合、返却値が未定義ならValueErrorが発生します)。

組み込み関数とコードポイント(参考)

文字と対応する整数値(コードポイント)を相互に変換するための組み込み関数が用意されています。

ord('🐍') # => 128013
hex(ord('🐍')) # => '0x1f40d'
chr(128013) # => '🐍'

name(chr[, default]) 文字の名前

文字に付与されている名前を取得する。

import unicodedata

unicodedata.name('🐍') # => 'SNAKE'
unicodedata.name('漢') # => 'CJK UNIFIED IDEOGRAPH-6F22'

lookup(name) 名前から文字を取得

unicodedata.lookup('GRINNING FACE') # => '😀'
unicodedata.lookup('SNAKE') # => '🐍'
unicodedata.lookup('HIRAGANA LETTER A') # => 'あ'

文字から数値を取得

decimal(chr[, default])

unicodedata.decimal('0') # => 0
unicodedata.decimal('1') # => 1
unicodedata.decimal('२') # => 2
unicodedata.decimal('۳') # => 3
unicodedata.decimal('૪') # => 4
unicodedata.decimal('੫') # => 5
unicodedata.decimal('౫') # => 6
unicodedata.decimal('൭') # => 7
unicodedata.decimal('໘') # => 8
unicodedata.decimal('𝟡') # => 9

unicodedata.decimal('五', 5) # => 5
# unicodedata.decimal('五') # => ValueError: not a decimal

digit(chr[, default])

unicodedata.digit('0') # => 0
unicodedata.digit('1') # => 1
unicodedata.digit('२') # => 2
unicodedata.digit('۳') # => 3
unicodedata.digit('૪') # => 4
unicodedata.digit('੫') # => 5
unicodedata.digit('౫') # => 6
unicodedata.digit('൭') # => 7
unicodedata.digit('໘') # => 8
unicodedata.digit('𝟡') # => 9

unicodedata.digit('五', 5) # => 5
#unicodedata.digit('五') # => ValueError: not a digit

numeric(chr[, default])

unicodedata.numeric('↉') #=> 0.0
unicodedata.numeric('⅒') #=> 0.1
unicodedata.numeric('⅑') #=> 0.1111111111111111
unicodedata.numeric('⅛') #=> 0.125
unicodedata.numeric('⅐') #=> 0.14285714285714285
unicodedata.numeric('⅙') #=> 0.16666666666666666
unicodedata.numeric('⅕') #=> 0.2
unicodedata.numeric('¼') #=> 0.25
unicodedata.numeric('⅓') #=> 0.3333333333333333
unicodedata.numeric('⅜') #=> 0.375
unicodedata.numeric('⅖') #=> 0.4
unicodedata.numeric('½') #=> 0.5
unicodedata.numeric('⅗') #=> 0.6
unicodedata.numeric('⅝') #=> 0.625
unicodedata.numeric('⅔') #=> 0.6666666666666666
unicodedata.numeric('¾') #=> 0.75
unicodedata.numeric('⅘') #=> 0.8
unicodedata.numeric('⅚') #=> 0.8333333333333334
unicodedata.numeric('⅞') #=> 0.875
unicodedata.numeric('⅟') #=> 1.0
unicodedata.numeric('⑮') # => 15.0
unicodedata.numeric('㉏') #=> 80.0

category(chr) 文字のカテゴリー名

unicodedata.category('a') # => 'Ll' Letter, Lowercase(文字,小文字)
unicodedata.category('A') # => 'Lu' Letter, Uppercase(文字,大文字)
unicodedata.category('1') # => 'Nd' Number, Decimal Digit(数字,10進数字)

east_asian_width(chr) 東アジアの文字幅

unicodedata.east_asian_width('a') # => 'Na' Narrow 狭 半角英数等
unicodedata.east_asian_width('1') # => 'Na' Narrow 狭 半角英数等
unicodedata.east_asian_width('ア') # => 'H' Halfwidth 半角 半角カナ等
unicodedata.east_asian_width('○') # => 'H' Halfwidth 半角 半角カナ等
unicodedata.east_asian_width('1') # => 'F' Fullwidth 全角 全角英数等
unicodedata.east_asian_width('A') # => 'F' Fullwidth 全角 全角英数等
unicodedata.east_asian_width('ア') # => 'W' Wide 広 漢字や仮名文字等
unicodedata.east_asian_width('あ') # => 'W' Wide 広 漢字や仮名文字等
unicodedata.east_asian_width('Θ') # => 'A' Ambiguous 曖昧 ギリシア文字やキリル文字
unicodedata.east_asian_width('Ж') # => 'A' Ambiguous 曖昧 ギリシア文字やキリル文字
unicodedata.east_asian_width('ث') # => 'N' Neutral 中立 アラビア文字等
unicodedata.east_asian_width('۞') # => 'N' Neutral 中立 アラビア文字等

c.f. 東アジアの文字幅 - Wikipedia

decomposition(chr) 文字分解

unicodedata.decomposition('ア') # => ''

unicodedata.decomposition('デ') # => '30C6 3099'
print(chr(int('30C6',16)), chr(int('3099',16))) # => テ ゙

normalize(form, unistr) 正規形

# 正規化形式C NFC(Normalization Form Canonical Composition) 正準等価性によって分解→正準等価性によって再合成
unicodedata.normalize('NFC', 'デ')

# 正規化形式KC NFKC(Normalization Form Compatibility Composition) 互換等価性によって分解→正準等価性によって再合成
unicodedata.normalize('NFKC', 'デ')

# 正規化形式D NFD(Normalization Form Canonical Decomposition) 正準等価性によって分解
unicodedata.normalize('NFD', 'デ')

# 正規化形式KD NFKD (Normalization Form Compatibility Decomposition) 互換等価性によって分解
unicodedata.normalize('NFKD', 'デ')
Originally published at marusankakusikaku.jp
ツイッターでシェア
みんなに共有、忘れないようにメモ

maru3kaku4kaku

Pythonこつこつ学習中。よく忘れる。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント