43号線を西へ東へ

フリーランスの備忘録、アウトプットの実験場

全角文字<=>半角文字に変換するPythonコード

このブログはプロモーションリンクを含むときがあります


ChatGPTを使ってPythonコードを作りました。

入力フォーム等で全角文字を指定されるケースがちょくちょくあります。

自分のルールでは「123」のような全角数字は使わず、「123」のように半角数字を使っています。日本語入力ソフトのATOKで、英数字は半角しか出ないように設定をしています。

どうしても全角文字を入力せざるを得ない時、わざわざATOKの設定を変えなくてもよいように、PythonのコードをChatGPTに作成してもらいました。

まとめておきます。

お役所は全角文字がお好き

公文書は全角文字を使うのがしきたりのようです。今回法人設立を行ったときに全角文字指定のところがいくつかありました。

役所の連絡先メールアドレスが全角で書かれており、半角に打ち直してメールするよう指示を受けました。

いやいや、そこは半角で送ってきてほしいのですが。手打ちではミスが起こりますからコピペするでしょう。

全角文字を半角に直す、またはその逆。そういう場合は、Pythonがなんとかしてくれそうです。

半角英数字を全角に直すようなコードをChatGPTに書いてもらいました。

Pythonコード

  • 英数字の全角<->半角変換を行います
  • カタカナの変換は行いません
  • 半角と全角が混在した場合はどちらかを選択できます

コードはクリックで展開します。

Details

import unicodedata

def zenkaku_to_hankaku(text):
    result = ''
    for char in text:
        # 全角文字の場合、半角に変換
        if unicodedata.east_asian_width(char) in 'FWA':
            char = unicodedata.normalize('NFKC', char)
        result += char
    return result

def hankaku_to_zenkaku(text):
    result = ''
    for char in text:
        # 半角文字の場合、全角に変換
        if unicodedata.east_asian_width(char) == 'Na':
            char = unicodedata.normalize('NFKC', char)
        result += unicodedata.normalize('NFKC', char)
    return result

def mixed_conversion(text):
    zenkaku_result = zenkaku_to_hankaku(text)
    hankaku_result = hankaku_to_zenkaku(text)
    return zenkaku_result, hankaku_result

def main():
    user_input = input("文字列を入力してください: ")
    
    contains_full_width = any(unicodedata.east_asian_width(char) in 'FWA' for char in user_input)
    contains_half_width = any(unicodedata.east_asian_width(char) == 'Na' for char in user_input)
    
    if contains_full_width and contains_half_width:
        choice = input("入力文字列には全角と半角が混在しています。変換方法を選択してください (1: 半角に変換, 2: 全角に変換): ")
        if choice == '1':
            result = zenkaku_to_hankaku(user_input)
        elif choice == '2':
            result = hankaku_to_zenkaku(user_input)
        else:
            print("無効な選択です。終了します。")
            return
    elif contains_full_width:
        result = zenkaku_to_hankaku(user_input)
    else:
        result = hankaku_to_zenkaku(user_input)
    
    print("変換結果:", result)

if __name__ == "__main__":
    main()

図示しました

flowchart TD
    A[main関数の開始] --> B[ユーザー入力の取得]
    B --> C{全角と半角が混在しているか?}
    C -->|Yes| D[変換方法の選択を要求]
    C -->|No, 全角のみ| E[zenkaku_to_hankaku関数を呼び出し]
    C -->|No, 半角のみ| F[hankaku_to_zenkaku関数を呼び出し]
    D --> G{選択: 1 半角に変換}
    D --> H{選択: 2 全角に変換}
    G --> I[zenkaku_to_hankaku関数を呼び出し]
    H --> J[hankaku_to_zenkaku関数を呼び出し]
    E --> K[結果を出力]
    F --> K[結果を出力]
    I --> K[結果を出力]
    J --> K[結果を出力]
    K --> L[main関数の終了]

コードについて(AIによる解説)

このコードで使用したライブラリとその役割について解説します。

1. unicodedata ライブラリ

unicodedataは、Pythonの標準ライブラリであり、Unicode文字データベースへのアクセスを提供します。このライブラリを使用することで、文字の正規化やカテゴリ情報、東アジアの幅情報などにアクセスできます。

使用した関数:

  • unicodedata.normalize(form, unistr)

    • 文字列を指定した正規化形式に変換します。
    • NFKC(互換分解後、組成を行う形式)を使用して、全角文字を半角に、またはその逆に変換するのに利用します。
    • 例:全角の「A」を半角の「A」に変換。
  • unicodedata.east_asian_width(char)

    • 文字の東アジア幅を返します。返される値は次のいずれかです:
      • 'F'(全角)
      • 'W'(全角)
      • 'A'(曖昧)
      • 'H'(半角)
      • 'Na'(半角)
      • 'N'(中立)
    • 例:文字が全角か半角かを判定するために使用します。

まとめ

全角英字のメールアドレスが送られてきたので、Pythonで変換を行うために、ChatGPTにコードを書いてもらいました。

これで、申し込みフォームで番地の全角を指定されても大丈夫です。ただ、わざわざPythonを立ち上げる必要があります。

どうせなら右クリックで起動するようにしょうと思ったら、レジストリをいじらないといけないようです。敷居が高いのでまたの機会にしておきます。