Pythonの全角の変換や判定
Pythonの全角・半角の変換 translateやunicodedata.normalize
Pythonのunicodedataモジュールのnormalize関数は、Unicode文字列の正規化処理を行うものです。Unicode文字列の正規化とは、UTF-8などのUnicodeエンコーディングを使用して表現された文字列を、標準的なUnicode表現に変換する処理です。
unicodedata.normalize関数は、引数として正規化するフォーマットを指定することができます。NFC(Normalization Form Canonical Composition)やNFD(Normalization Form Canonical Decomposition)などが指定可能です。また、引数として渡した文字列が正しいUnicode文字列であるかをチェックする機能も持っています。
全角→半角変換を行う場合は、引数に「NFKC」を指定します。
# テキストの全角・半角変換を行うサンプルコード import unicodedata # 対象の文字列 src_str = "ABCabc123123" # 全角を半角に変換 dst_str = unicodedata.normalize('NFKC', src_str) # 結果を出力 print(dst_str) # 出力:ABCabc123123
実行すると、全角・半角混じりの文字列は、「ABCabc123123」に変換されます。
Pythonのtranslate関数を使うことでも、全角・半角変換ができます。テキストから指定した文字を他の文字に変換する関数です。全角文字を半角文字に変換するには、以下のようにします。
table = str.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz') str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" # 全角文字を半角文字に変換 str = str.translate(table) print(str)
実行するとこうなります。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
mojimojiモジュールを使っての全角・半角変換も可能です。
mojimojiとは、Pythonで日本語の文字列を扱うためのライブラリです。このライブラリを使うことで、日本語の文字列をスッキリした形式に整えたり、日本語の文字列を検索したり、日本語の文字列を句読点で分割したりすることができます。また、mojimojiでは日本語の文字列を簡単にUnicodeに変換することも可能です。
全角・半角変換を行うための関数「zen_to_han()」と「han_to_zen()」が用意されています。
zen_to_han()関数は、全角文字を半角文字に変換します。han_to_zen()関数は、半角文字を全角文字に変換します。
import mojimoji before_text = 'ABCD123' after_text = mojimoji.han_to_zen(mojimoji.zen_to_han(before_text)) print(after_text) # ABCD123
実行すると「ABCD123」となります。
Pythonの全角判定 unicodedata.east_aian_width
Pythonの全角判定は、unicodedataモジュールのeast_asian_widthで判定可能です。
unicodedata.east_asian_width(ch) in ‘FWA’は、指定した文字chが全角(F:Fullwidth)、半角(H:Halfwidth)、拡張(W:Wide)、または半拡張(A:Ambiguous)であるかどうかを示すものです。拡張文字とは、日本語などのアジア言語で使用される文字を指します。
import unicodedata def is_full_width(text): for ch in text: if unicodedata.east_asian_width(ch) in 'FWA': return True return False text = 'ABC' print(is_full_width(text))
実行するとこうなります。「ABC」が全角であると判定されました。
True
Pythonの全角・半角を区別しない判定
Pythonで全角・半角を区別せずに同じかどうか判定するには、2つの文字列を半角に変換してから比較します。
import unicodedata def ignore_case(str1, str2): # 全角を半角に変換して比較 str1 = unicodedata.normalize('NFKC', str1) str2 = unicodedata.normalize('NFKC', str2) return str1.lower() == str2.lower() # 実行例 str1 = "ABC" str2 = "abc" print(ignore_case(str1, str2)) # True
実行結果は、Trueとなります。
Pythonの全角のまとめ
- 全角文字は、半角文字と比較して2倍のサイズで表示される
- 全角文字を使用するときは、文字種(英数字・記号・漢字など)に注意が必要
- Pythonでは、文字列を全角・半角区別して扱うことが可能