Edited at

\xで始まる文字列を解析する

ブログ記事のコピーです。

Apacheのエラーログを漁っている途中、困った事態に遭遇しました。

[MMM mmm dd hh:ii:ss yyyy] [error] [client xxx.xxxx.xxx.xxx] WordPress \xe3\x83\x87\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\x99\xe3\x83\xbc\xe3\x82\xb9\xe3\x82\xa8\xe3\x83\xa9\xe3\x83\xbc: Lost connection to MySQL server during query for query SELECT option_value FROM wp_options WHERE option_name = 'hogehoge' LIMIT 1 made by require_once('wp-load.php'), ...()..., referer: http://example.com/wp-admin/edit.php?post_type=post

みたいなエラーログを見付けました。半角英数字の部分からWordPressのMySQLのクエリがコケていることは分かるのですが、メッセージ内容が読めません。これをどうにかして読みたい……。

色々検索はしてみたのですが、「バックスラッシュエックス」や「円マークエックス」といったキーワードだとヒットせず、手あたり次第エンコード・デコードのサービスに突っ込んでみましたが解析できず。

何とか末尾の参考記事からUTF-8っぽいことは分かったのですが、巷のWebサービスでは解析できず、半ば途方に暮れました。こういう類の検索って上手くヒットさせることができずに悩むのですよね……。


対処

最終的にどうしたかというと、どうにか解析できそうな方法がPythonしか見当たらなかったのでPythonを入れました(今回は自分のPCに既に2.7系が入っていたのでそれを使用)。その上でPythonのコードに先ほどの文字列を突っ込みます。

print(b'WordPress \xe3\x83\x87\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\x99\xe3\x83\xbc\xe3\x82\xb9\xe3\x82\xa8\xe3\x83\xa9\xe3\x83\xbc: Lost connection to MySQL server during query for query SELECT option_value FROM wp_options WHERE option_name ='.decode('utf-8'))

「\x??\x??\x??」となっている部分さえどうにかなれば良いので、そこだけ突っ込むようなイメージです。上記の例では半角英数字部分も突っ込んでますが。

これで、test.pyとかdecode.pyとか適当な名前で保存してあげて、コマンドプロンプトを起動。先ほどのpyファイルを保存したディレクトリまで移動して、pyファイルを実行。

デコードできて日本語が読めるようになった図

実行した結果、ちゃんと日本語として読むことができました。……このメッセージからでは当初より情報量が増えていないのが悲しいところですが、とりあえず今後も同じようなログに遭遇した際の備忘録としてメモしておきます。


参考