54349


Python やそのほかのプログラミング言語、プラットフォームで、Shift_JIS
っぽい日本語のデータをデコードするのに失敗した人たちが、文字エンコーディングとして Shift_JISX0213 や Shift_JIS-2004
を指定すると読める、というノウハウを公開しています。

しかしもし Windows 由来のデータを Shift_JIS X 0213 系の文字コードとして読んでしまうとバックスラッシュ `\` `0x5c`,
たちさき `﨑` `0xfa0xb1`, はしごだか `髙` `0xfb0xfc` がそれぞれ `¥` `U+00A5`, `郫`, `騠`
に文字化けします。

自分のブログに、その文字コードを使うのはほぼ誤解であり、[正しくは cp932 (ms932)
であると書いた](https://criticabug.hatenablog.com/entry/python-cp932)
のですが、はっきりさせたくなりました。

実際に誤解ではなく Shift_JIS X 0213 系の文字コードを使うシステムはあるのでしょうか？ ブラウザはほぼ対応していないです。

2010年の本『プログラマのための文字コード技術入門』（矢野啓介）では適した用途として

> Shift_JIS-2004 は Shift_JIS の資産と互換性を保ちつつ JIS X 0213
> に対応するのに適した符号化方式です。（…中略…）今後は、Shift_JIS というときにもっぱら Shift_JIS-2004
> を用いるという手もあります。

と、可能性が示唆されている感じでした。


CC BY-SA 4.0
2019-04-04T04:09:28.037
53903
2019-04-21T00:12:26.517
2019-04-19T05:08:03.823
5469
5469
question
文字化け 文字コード shift-jis
Shift_JISX0213 (Shift_JIS_2004) はどこで使われていますか？


MSでないSJIS X 213で入力されたならMSでないSJIS X 213で読み取り、  
MS932で入力されたならMS932で読み取ります。

あなたが読み取ろうとしているデータがどこからどう入力されたかの仕様を調べてください。  
一般的に、  
Windowsで使用されるアプリケーション全般でsjisで保存とあれば実際にはMS932ですし、  
Macや ~~iPhone~~ のアプリケーション全般でsjisを指定したなら、それはsjis 2004です。  
ただし、実際には個々のアプリケーションの実装に依存します。

追記  
iPhoneアプリ作成時に使用する典型的なSwiftやObjective-
Cでは、0x80000A01を指定しないとCP932でないSJISを得られないみたいですね。かなり少ないことが予想されます。


CC BY-SA 4.0
2019-04-04T05:50:05.073
53908
2019-04-04T06:57:54.093
2019-04-04T06:57:54.093
25396
25396
53903
answer


> Windows 由来のデータを Shift_JIS X 0213 系の文字コードとして読んでしまうと（中略）文字化けします。

おっしゃる通りです。Windowsでは[JIS X
0213](https://ja.wikipedia.org/wiki/JIS_X_0213)に対応していますが、それは文字集合としてのJIS X
0213が収録されているUnicode3.1以降に対応しているという意味で、符号化としての[Shift_JIS-2004](https://ja.wikipedia.org/wiki/Shift_JIS-2004)エンコーディングには対応していません。  
具体的には、Shift_JIS-2004の第3水準漢字、第4水準漢字部分は[NEC選定IBM拡張文字およびIBM拡張文字](https://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932#Windows-31J_%E3%81%AB%E9%87%8D%E8%A4%87%E7%99%BB%E9%8C%B2%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89)とバッティングします。

ですので、Windowsが扱うShift-JIS的エンコーディングはcp932(ms932)で間違いないです。またWindowsとのやりとりでJIS X
0213を扱いたいのであればUTF-8などUnicodeを使用する必要があります。


CC BY-SA 4.0
2019-04-04T06:28:12.847
53909
2019-04-04T06:28:12.847
4236
53903
answer


プログラミング言語 Gauche では [sjis を Shift_JIS X 0213 と定義している](http://practical-
scheme.net/gauche/man/?l=ja&p=%E3%83%9E%E3%83%AB%E3%83%81%E3%83%90%E3%82%A4%E3%83%88%E6%96%87%E5%AD%97%E5%88%97)
ので、Gauche で組まれたシステムでは（知ってか知らずか）Shift_JIS X 0213 を入出力している可能性があります。


CC BY-SA 4.0
2019-04-20T12:16:37.670
54342
2019-04-20T12:16:37.670
5469
53903
answer


Shift_JIS-2004はIANAの[Character
sets](https://www.iana.org/assignments/character-sets/character-
sets.xhtml)にも登録されていませんし、UNICODEの[MAPPINGS](https://unicode.org/Public/MAPPINGS/)にもありません。標準で使っているようなシステムはたぶん
**存在しない** と思われます。

以下Shfit_JISとその亜種や拡張を標準で採用しているシステムと対応言語をまとめました。

  * Shift_JIS **IANA登録あり** [UNICODEマッピング](https://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT)  
言語: Java(Shift_JIS), Python(shift_jis), PHP(SJIS), Ruby(Shift_JIS)

  * Shift_JISX0213  
言語: Python(shift_jisx0213)

  * Shift_JIS-2004  
言語: Python(shift_jis_2004)

  * Windows-31J **IANA登録あり** [UNICODEマッピング](https://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT)  
システム: Windows  
言語: Java(windows-31j), .NET(shift_jis), Python(cp932), PHP(SJIS-win),
Ruby(Windows-31J)

  * MacJapanese [UNICODEマッピング](https://unicode.org/Public/MAPPINGS/VENDORS/APPLE/JAPANESE.TXT)  
システム: Mac OS 9以前  
言語: .NET(x-mac-japanese), PHP(SJIS-mac), Ruby(MacJapanese)

  * SJIS-DoCoMo  
システム: ドコモの携帯電話  
言語: PHP(SJIS-Mobile#DOCOMO), Ruby(SJIS-DoCoMo)

  * SJIS-KDDI  
システム: auの携帯電話  
言語: PHP(SJIS-Mobile#KDDI), Ruby(SJIS-KDDI)

  * SJIS-SoftBank  
システム: ソフトバンクの携帯電話  
言語: PHP(SJIS-Mobile#SOFTBANK), Ruby(SJIS-SoftBank)

各言語は下記リンク先を参考にしています。  
[Java](https://docs.oracle.com/en/java/javase/12/intl/supported-
encodings.html), [.NET](https://docs.microsoft.com/ja-
jp/dotnet/api/system.text.encodinginfo.getencoding?view=netframework-4.8),[Python](https://docs.python.org/ja/3.8/library/codecs.html),
[PHP](https://www.php.net/manual/ja/mbstring.supported-encodings.php),
[Ruby](https://docs.ruby-lang.org/ja/latest/class/Encoding.html)

各携帯電話会社のSJIS拡張は絵文字用でしたが、Unicodeへの絵文字追加によってスマートフォンでは直接Unicode(UTF-8)でやり取りしているようです。

上のリストの「システム」はデフォルト設定でその文字コードになることがあるということです。わざわざ選択した場合、例えば、Mac OS
X以降のテキストエディットで日本語(Mac)を選ぶとMacJapaneseになったりします。他にも、LinuxでもShift_JISをデフォルトロケールに設定することもできます。しかし、それらをわざわざ使う人はいないと思われます。

* * *

OS等では対応していなくても、文字コードをよく理解していないプログラマーが作ったシステムであれば、Shift_JIS-2004を使ってしまっている可能性はあります。たとえば、次のようなシナリオです。

  1. とあるデータ(名称などに漢字が含まれている)を分析するPythonのプログラムを作ることになった。
  2. 分析結果の表を「Excelで読み込めるようにシフトジスのCSVファイルでデータを出力してくれ」と依頼された。
  3. 文字コードを"shift_jis"に設定して出力するようにした。
  4. その後のテストで一部の文字がエラーになることがわかった。JISX2013で追加された文字だったので、より大きい領域を持つ"shift_jis-2004"に設定しなおした。

こうして、エラーも起きなかったのでそのままプログラムを納品してしまい、後ほど、Excelで見ると文字化けしている、違う文字になっているとクレームが入ることになるでしょう(日本語版のExcelはBOMが無いとWindows-31Jで解釈します)。「シフトジス」という言葉はShift_JISなのか、Windows-31Jなのか、はたまた、MacJapaneseなのかを理解していない人は多いので、誰かが作ったシステムから出力されたファイルであれば、その人にちゃんと確認しておいた方が良いかと思います。


CC BY-SA 4.0
2019-04-21T00:12:26.517
54349
2019-04-21T00:12:26.517
7347
53903
answer