Ruby の SJIS 系文字コードを調べてみた

# これは何？

[PHPのSJIS系文字エンコーディングとエイリアスを表にまとめてみた]( https://qiita.com/KaiShoya/items/d335accbd5e995d9eb23 ) を読んで、ruby はどうなのかなと思って調べた。

# 名前

ruby 3.0.1 に入っている全文字コードの中で `"しふとジス"` という文字列をバイト列にしたときに cp932 と同じバイト列になるものを列挙した。

|メイン名|別名|
|:--|:--|
|SJIS-DoCoMo|特になし|
|SJIS-KDDI|特になし|
|SJIS-SoftBank|特になし|
|Shift_JIS|特になし|
|Windows-31J|CP932, csWindows31J, SJIS, PCK|

え。PCK って何？と思って調べたら、Solaris 上の Shift_JIS（あるいはそれに類するなにか）の名前らしい。

`SJIS` と `Shift_JIS` が別のエンコーディングなのか。罠だね。

というわけで、５つの SJIS 系文字コードの差異を調べてみた

# ５つの文字コードの差異

全部挙げると膨大すぎるので、適当にピックアップした。

太字は少数派。

変換失敗と私用領域は両方 error という表記にした。

|bytes|SJIS-DoCoMo|SJIS-KDDI|SJIS-SoftBank|Shift_JIS|Windows-31J|
|:--|:--|:--|:--|:--|:--|
|`81 5c`|"―" `U+2015`|"―" `U+2015`|"―" `U+2015`|**"—" `U+2014`**|"―" `U+2015`|
|`81 60`|"～" `U+ff5e`|"～" `U+ff5e`|"～" `U+ff5e`|**"〜" `U+301c`**|"～" `U+ff5e`|
|`81 61`|"∥" `U+2225`|"∥" `U+2225`|"∥" `U+2225`|**"‖" `U+2016`**|"∥" `U+2225`|
|`81 7c`|"－" `U+ff0d`|"－" `U+ff0d`|"－" `U+ff0d`|**"−" `U+2212`**|"－" `U+ff0d`|
|`81 91`|"￠" `U+ffe0`|"￠" `U+ffe0`|"￠" `U+ffe0`|**"¢" `U+00a2`**|"￠" `U+ffe0`|
|`81 92`|"￡" `U+ffe1`|"￡" `U+ffe1`|"￡" `U+ffe1`|**"£" `U+00a3`**|"￡" `U+ffe1`|
|`81 ca`|"￢" `U+ffe2`|"￢" `U+ffe2`|"￢" `U+ffe2`|**"¬" `U+00ac`**|"￢" `U+ffe2`|
|`87 40`|"①" `U+2460`|"①" `U+2460`|"①" `U+2460`|**error**|"①" `U+2460`|
|`87 5f`|"㍉" `U+3349`|"㍉" `U+3349`|"㍉" `U+3349`|**error**|"㍉" `U+3349`|
|`87 83`|"㏍" `U+33cd`|"㏍" `U+33cd`|"㏍" `U+33cd`|**error**|"㏍" `U+33cd`|
|`87 8a`|"㈱" `U+3231`|"㈱" `U+3231`|"㈱" `U+3231`|**error**|"㈱" `U+3231`|
|`ed 40`|"纊" `U+7e8a`|"纊" `U+7e8a`|"纊" `U+7e8a`|**error**|"纊" `U+7e8a`|
|`f1 b2`|error|error|**"🀄" `U+1f004`**|error|error|
|`f3 44`|error|**"🀄" `U+1f004`**|**"↘" `U+2198`**|error|error|
|`f4 80`|error|**"↕" `U+2195`**|**"⭐" `U+2b50`**|error|error|
|`f4 83`|error|error|**"⭕" `U+2b55`**|error|error|
|`f6 a5`|error|**"🇯🇵" `U+1f1ef` `U+1f1f5`**|error|error|error|
|`f6 e4`|error|error|**"🇯🇵" `U+1f1ef` `U+1f1f5`**|error|error|
|`f7 6d`|error|error|**"🀄" `U+1f004`**|error|error|
|`f7 90`|error|**"🇺🇸" `U+1f1fa` `U+1f1f8`**|**"🅿" `U+1f17f`**|error|error|
|`f7 aa`|error|**" " `U+2002`**|**"♿" `U+267f`**|error|error|
|`f7 b6`|error|**"⛳" `U+26f3`**|**"🈚" `U+1f21a`**|error|error|
|`f7 d9`|error|**"☑" `U+2611`**|**"↙" `U+2199`**|error|error|
|`f8 f5`|**"✌" `U+270c`**|error|error|error|error|
|`f9 49`|**"↙" `U+2199`**|error|**"☎" `U+260e`**|error|error|
|`f9 77`|**"✉" `U+2709`**|error|**"⛪" `U+26ea`**|error|error|
|`fa 43`|"ⅳ" `U+2173`|"ⅳ" `U+2173`|"ⅳ" `U+2173`|**error**|"ⅳ" `U+2173`|
|`fa 51`|"Ⅷ" `U+2167`|"Ⅷ" `U+2167`|"Ⅷ" `U+2167`|**error**|"Ⅷ" `U+2167`|
|`fa 58`|"㈱" `U+3231`|"㈱" `U+3231`|"㈱" `U+3231`|**error**|"㈱" `U+3231`|
|`fb 41`|"涬" `U+6dac`|"涬" `U+6dac`|**error**|**error**|"涬" `U+6dac`|
|`fb 54`|"焄" `U+7104`|"焄" `U+7104`|**"☺" `U+263a`**|**error**|"焄" `U+7104`|
|`fb ab`|"譓" `U+8b53`|"譓" `U+8b53`|**"🇯🇵" `U+1f1ef` `U+1f1f5`**|**error**|"譓" `U+8b53`|
|`fb d7`|"錥" `U+9325`|"錥" `U+9325`|**"™" `U+2122`**|**error**|"錥" `U+9325`|
|bytes|SJIS-DoCoMo|SJIS-KDDI|SJIS-SoftBank|Shift_JIS|Windows-31J|


全体を眺めると

* Shift_JIS は文字が少ない
* `81 xx` の辺りで、一見同じ文字だけど実は Shift_JIS だけ違うコードポイントに行くことが割とある。
* Shift_JIS ほどではないけど、SJIS-SoftBank も漢字少なめ (`fb 41` のような例がたくさんある)
* SJIS-SoftBank は、同じ絵文字に複数のコードポイントがあたっていてそれが特に他社と一致しているわけではなかったりする。社内の連絡が悪かったのかな。
* SJIS-SoftBank は、他の人が漢字につかっている領域に絵文字を入れてきたりする。
* ㈱ などは、Shift_JIS 以外は二箇所にあったりする。NEC と IBM なのかな。

# 補足

MacJapanese も調べたかったんだけど、 ruby では変換出来ないのでやめた。gem をいれたりすればできるみたいだけど。

あと、PHP は対応している「SJIS-2004」とかが無いのが残念だった。