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関数を使って文字列をスクリプトとして再評価した後に デコードせよ