「ワンダーラビットガール」の文字化けを復元する

「[ワンダーラビットガール](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%83%B3%E3%83%80%E3%83%BC%E3%83%A9%E3%83%93%E3%83%83%E3%83%88%E3%82%AC%E3%83%BC%E3%83%AB)」はジャンプSQで連載中のエロいマンガである。兄が残した女の子の性癖リストを使って、弟が女の子を落としていく話。書いていて、何を言っているんだ？という気がしててきたけど、そういう話なのでしょうがない。ちなみに、性癖の「性」は性的の「性」ではなく、性質の「性」であって、性的嗜好だけではなくもっと広い意味を持っている[らしい](https://ja.wikipedia.org/wiki/%E6%80%A7%E7%99%96)。

兄の残したリストのうちある女の子の性癖が文字化けしていて、さあ困ったぞ、というのがここ2話のストーリー。困るので復元してみよう。

![wonder.jpg](https://qiita-image-store.s3.amazonaws.com/0/25276/63aee7c4-501b-587f-7e6a-9c482a7c937c.jpeg)
ジャンプSQ 2015年12月号より

まずは、文字を画像から読み取らないと始まらない。最近のIMEならば手書き入力で検索できる。

![image](https://qiita-image-store.s3.amazonaws.com/0/25276/5f5a2cc6-122c-84fa-c2e5-be586349c8ff.png)

頑張って入力すると次のようになる。

```
3年A組　緑ノ 柊
性癖
┗髴ｲ蜃ｺ迢�‥
繧ｭ繧ｷ繝� 繝ｧ繝�繝･
```

このうち`�`は解釈できなかった文字の代わりに表示されるもので、実際にどのようなバイト列だったかは分からない。[参照](https://en.wikipedia.org/wiki/Specials_(Unicode_block))。

漢字、半角カナ、漢字、半角カナ、…と並ぶのは、UTF-8で書かれたテキストをShift_JISと解釈した場合の特徴である。だいたいの日本語はUTF-8では3バイトで表現され、Shift_JISでは漢字は2バイトで半角カナは1バイトだから、このようになる。

文字列をUTF-8でエンコードし、Shift_JISでデコードする処理は、Pythonだと次のようになる。`�`はたぶん1バイトの文字だろうから、とりあえず`?`としておいた。

```py3
# coding: utf-8
x = u"""髴ｲ蜃ｺ迢?‥
繧ｭ繧ｷ繝? 繝ｧ繝?繝･"""
print (x
    .encode("shift_jis", errors="replace")
    .decode("utf-8", errors="replace")
    .encode("shift_jis", errors="replace"))
```
最初の行のutf-8はスクリプトの文字コードで、最後の行のshift_jisは画面の文字コードなので、適当に。encodeとdecodeのデフォルトの動作では変換に失敗すると例外を吐いてしまうので、`errors="replace"`を指定して失敗した文字を別の文字に置き換えて処理を続行させている。実行結果は次の通り。

```
露出???d
キシ?? ョ??ュ
```

今月（2015年1月）号で、「この子の性癖って<ruby>露出癖<rp>（</rp><rt>エキシビジョニズム</rt><rp>）</rp></ruby>――!?」という台詞が出てきているので、正しそう。

「癖」が正しく復元されていない。UTF-8の「癖」は`E7 99 96`でこれをShift_JISで解釈すると最初の1文字は`逋`になるはず。文字化けっぽくするために修正が加えられているのかもしれない。2行目のカタカナも謎。今まで、このマンガで性癖以外に何か説明が書いてあることはあっただろうか……？　どこかで文字コードを変えれば読めるようになるはずので、次号以降の主人公に期待しよう。

表にまとめた。

<table>
<tr><td>Shift_JIS</td><td colspan="2">髴</td><td>ｲ</td><td colspan="2">蜃</td><td>ｺ</td><td colspan="2">迢</td><td>�</td><td colspan="2">‥</td></tr>
<tr><td>バイト列</td><td>E9</td><td>9C</td><td>B2</td><td>E5</td><td>87</td><td>BA</td><td>E7</td><td>8B</td><td>??</td><td>81</td><td>64</td></tr>
<tr><td>UTF-8</td><td colspan="3">露</td><td colspan="3">出</td><td colspan="3">？</td><td colspan="2"></td></tr>
</table>

<table>
<tr><td>Shift_JIS</td><td colspan="2">繧</td><td>ｭ</td><td colspan="2">繧</td><td>ｷ</td><td colspan="2">繝</td><td>�</td><td> </td><td colspan="2">繝</td><td>ｧ</td><td colspan="2">繝</td><td>�</td><td colspan="2">繝</td><td>･</td></tr>
<tr><td>バイト列</td><td>E3</td><td>82</td><td>AD</td><td>E3</td><td>82</td><td>B7</td><td>E3</td><td>83</td><td>3F</td><td>20</td><td>E3</td><td>83</td><td>A7</td><td>E3</td><td>83</td><td>3F</td><td>E3</td><td>83</td><td>A5</td></tr>
<tr><td>UTF-8</td><td colspan="3">キ</td><td colspan="3">シ</td><td colspan="3">？</td><td> </td><td colspan="3">ョ</td><td colspan="3">？</td><td colspan="3">ュ</td></tr>
</table>

実際のファイルを http://sanya.sweetduet.info/wonder_rabbit_girl.txt に置いた。ヘッダでShift_JISを指定している。ブラウザのエンコードをUTF-8にすれば、ここまでの説明のようにある程度読めるはず。

# 追記

>
Hi-king
狂(E78B82)ですかね

たしかに。ShiftJISだと`0x82`だけだと文字にならないので�と辻褄が合う。

Hi-kingさん曰く、カタカナは「（エ）キシビジョニズムではないか？」とのこと。たしかにその通りだと思う。「エキシビジョニズム」をUTF-8で表現すると、

|文字|バイト列|
|:--|:--|
|エ|E3 82 A8|
|キ|E3 82 AD|
|シ|E3 82 B7|
|ビ|E3 83 93|
|ジ|E3 82 B8|
|ョ|E3 83 A7|
|ニ|E3 83 8B|
|ズ|E3 82 BA|
|ム|E3 83 A0|