python 数列をutf-8で強制的にデコードし、日本語に逆変換する方法

文字コード
この記事は約3分で読めます。

python を使って数列を強制的にutf-8でデコードできると

ログデータや通信データに数列として日本語を埋め込めるようになります

すごく簡単に関数化できますので、ご紹介します。コピペで出来ます

本日の伝えたいこと

✔ pythonで強制的にutf-8デコードするときは、eval関数を使って文字列をスクリプトとして再評価せよ

困ったこと

数字の羅列に ¥xを追加するのが至難の業。

・str + ¥x は、お決まりのエスケープ文字として扱われNG

・str + ¥¥xは、¥xを足すことはできるが、文字列として¥xを足してしまう。狙いとするutf-8としての接頭語にならない

内容

文字列を連結して、evalで評価させるようの式を作り読み込ませる

メリット

デコード環境が整うため、数字のみで文字を表現できるようになるので、

各種ログに日本語を埋め込むなど汎用性が爆発的に広がる

解決方法

文字列を2つまとまりで分離する

reモジュールの中のsplit関数を使うと簡単に実行できる

list = re.split(‘(..)’, 文字列)[1::2]

この書式で、数字の羅列を2つずつに区切り、list格納することができる

接頭後の¥xをつける

while文でループさせ、listの中の文字の頭に¥xを付けている。

output = output + “\\x” + list[cnt]   

終了条件として、数字が00という連続で来た場合は NULを示すため

文字列の読み取りが完了したとしてbreakさせるのがオススメ

evalで文字列を評価する←重要ポイント

出来上がった文字列をバイナリ文字列であることを示すために

文字の頭に”b”を付与し

output = str(“b'”+output+”‘”)

として、評価可能な文字列にする。

それができたらevalによる再評価→デコードで数列の文字列化が可能となる

output = eval(output)

output = output.decode(“utf-8”)

サンプルコード

sample.py

def convert_utf8format(word):
    list = re.split(‘(..)’,word)[1::2]
    cnt = 0
    output = “”
    while (cnt < len(list)):
        # print(list[cnt])
        if (str(list[cnt]) == str(“00”)):
            break
        output = output + “\\x” + list[cnt]
        cnt = cnt + 1
    # print(output)
    output = str(“b'”+output+”‘”)
    output = eval(output)
    output = output.decode(“utf-8”)
    return output

実際の現場で求められること

ここまでやる必要があるのか?メモならエクセルで取れば十分だと言われるだろう

ただ、考えてみてほしい。バイナリデータの中に文字列を自在に埋め込み

自在にデコードことができると、自動レポートのクオリティが向上するのだ

全てを自動化するためには文字列を数値化する作業は避けては通れない

食わず嫌いせずにやってみてほしい。

まとめ

✔ eval関数を使って文字列をスクリプトとして再評価した後に デコードせよ

タイトルとURLをコピーしました