「CP932」を「Shift JIS」だと思って使っていませんか? 入出力ファイルのデフォルト文字コードは? Windowsの「Shift JIS」には落とし穴がたくさんあります。最初が肝心ですので、後回しにしないようにしましょう。
なお、最初に覚えるべき「Shift JIS」は2つだけです。「Shift JIS」の変遷といっしょに理解すると覚えやすくなります。
なお、ファイルの入出力については以下の記事を参照してください。
Python♪用途別にまとめたファイルの入出力コード
1.「Shift JIS」はたくさんある
文字コードの中でも、最もやっかいなのが「Shift JIS」です。一言で「Shift JIS」といっても、Pythonで指定できる「Shift JIS」は「'cp932'」「'shift_jis'」「'shift_jisx0213'」「'shift_jis_2004'」の4種類もあります。
そして、もし以下の内容が難しいと感じるようであれば、この記事を読み進めてください。
- メモ帳で保存するときに選ぶことができる文字コード「ANSI」も実は「Shift JIS」です。
- Pythonでファイルの入出力で「encoding =」の指定をしない場合の文字コードも「Shift JIS」です。でも、「encoding ='shift_jis'」で指定したときの「Shift JIS」とは別の「Shift JIS」です。
- 「Windows-31J」も「Shift JIS」です。
2.Shift JISの変遷
下の図は、主な「Shift JIS」の変遷です。この図に出てくる文字コードは全て広い意味での「Shift JIS」です。「Shift JIS」で混乱したときには、この図を見て知識を整理してください。
(細かい名称を覚える必要はありません。)
なお、下の図は見やすいように何度も表示しますが、同じ図ですので気にせず読み進めてください。
では、順番に説明します。まず、最初のShift JISは1982年に誕生しました。図の左上の「①Shift JIS(1982)」です。そこからJISとしては①→③→⑥→⑧→⑨→⑩のように変遷します。
この中で重要なのは「⑧JIS X0208-1997」です。IANAには⑧を「Shift JIS」として登録しています。つまり、狭い意味での「Shift JIS」は「⑧JIS X0208-1997」だけです。
IANAとはインターネットに関連する番号を管理する組織です。つまり、たくさん「Shift JIS」はあるけれど、正式に認められた「Shift JIS」は1つだけなのです。

一方、Microsoftが日本でMS-DOSやWindowsを展開する上で標準の日本語コードとして最初に選んだのが「①Shift_JIS (1982)」です。Microsoftの標準日本語コードの管理番号はCP932なので「CP932」とも呼ばれます。
しかし、「①Shift_JIS (1982)」が対象とする文字は種類が少なく、Microsoftは「①Shift_JIS (1982)」では足らない文字についてPCメーカーが自由に追加してもよいことにしていました。そこで、NECやIBMは独自に「①Shift_JIS (1982)」を拡張し、PCの利便性を高めていました。
しかし、独自の規格が乱立すると混乱をまねくため、Microsoftは1993年にそれらを統合し「Windows-31J」という名称でIANAに登録しました。Microsoft系の「Shift JIS」で覚えなければならないのは、この「⑦CP932(Windows-31J)」だけです。「⑦CP932(Windows-31J)」は、今でもWindowsパソコンにおいて標準の文字コードです。
「Shift JIS」はたくさんありますが、Windows環境で最初にで覚えるべき文字コードは正式な「Shift JIS」である「⑧JIS X0208-1997」と「⑦CP932(Windows-31J)」です。ゆとりがあれば、⑨Shift_JIS X0213、⑩Shift_JIS-2004も覚えましょう。
⑧、⑨、⑩の名称を正確に覚える必要はなく、本家本元の「Shift JIS」があり、その後にPythonで指定できる新しい「Shift JIS」が2つあるという程度の認識でかまいません。

さて、⑦CP932(Windows-31J)は、Windowsの標準コードとして、現在、最も使用されている「Shift JIS」であり、Pythonでは「'cp932'」と指定します。
一方、Pythonで文字コードを「'shift_jis'」と指定すると⑧JIS X 0208-1997が指定されます。
また、「⑨Shift_JIS X0213」は「'shift_jisx0213'」、「⑩Shift_JIS-2004」は「'shift_jis_2004'」と指定します。
3.CP932(Windows-31)には呼び名がたくさん
実はWindowsで使われている「Shift JIS」は、ほとんどが「⑦CP932(Windows-31J)」のことです。その他の「Shift JIS」は、ほとんど使用されません。
「⑦CP932(Windows-31J)」は「Shift JIS」「CP932」「Windows-31J」の3つの名称があり、文字コードとしての正式名称は「Windows-31J」です。
でも、正式名称で呼ばれることは少なく、「Shift JIS」と呼ばれることがほとんどです。
この3つの名称「Shift JIS」「CP932」「Windows-31J」は覚えましょう。
他にも「MS932」「ANSI」と呼ばれることがあり、混乱を生む元凶となっています。

(1) 正式な「Shift JIS」だと思ったら実は違うケース
以下の例は「⑦CP932(Windows-31J)」ですが、正式な「Shift JIS」である「⑧JIS X 0208-1997」と勘違いしている人が多いのではないでしょうか。
- Windowsのテキストエディタで「Shift JIS」を指定して保存した場合。
- WindowsのExcelで「CSV (コンマ区切り) (*.csv)」を指定して保存した場合。
勘違いして「encoding ='shift_jis'」で開いてしまうとエラーになることがあります。「encoding ='cp932'」が正解です。
「エラーになることがある」といったのは、広い意味の「Shift JIS」同士は、対応していない文字が含まれていなければエラーになりません。
例えばを「encoding ='cp932'」で保存した「㌧」は「encoding ='shift_jis'」で開こうとするとエラーになりますが、「encoding ='cp932'」で保存した「ABC」は「encoding ='shift_jis'」で開くことができます。
つまり、間違えた使い方をしても気が付かない可能性があります。
(2) メモ帳のANSI
メモ帳で保存できる文字コードは「ANSI」「UTF-16 LE」「 UTF-16 BE」「UTF-8」「UTF-8(BOM 付き)」の5種類ですが、「ANSI」は「⑦CP932(Windows-31J)」のことです。
(3) ファイル入出力の文字コードのディフォルト
OSによってデフォルトの文字コードは異なりますが、Windowsではファイルの入出力で「encoding =」の指定をしなかった場合は、「⑦CP932(Windows-31J)」として扱われます。
なお、コードの最初で指定する「-- coding: utf-8 --」はファイルの入出力とは関係ありませんので混同しないようにしましょう。
(4) JAVAのMS932
Pythonとは関係ありませんが、プログラム言語のJavaでは、「⑤CP932(IBM独自)」を「CP932」と呼び、それと区別するために「⑦CP932(Windows-31J)」を「MS932」と呼びます。
(5) 結局、Windowsでは「⑦CP932(Windows-31J)」ばかり
結局、Windowsのファイル入出力で使われる「Shift JIS」は、そのほとんどが「⑦CP932(Windows-31J)」です。つまり、「encoding ='shift_jis'」を使うことはほとんどありません。「encoding ='cp932'」を使うようにしましょう。
4.Pythonでは、どの文字コードを使えばよいのか
どの文字コードでも使えるのであれば、「Shift JIS」ではなく「UTF-8」を使いましょう。「Shift JIS」とは全く互換性はありませんが、対応する文字が多くOSにも依存しにくいです。
現在、世界中で最も使われている文字コードは「UTF-8」です。WindowsでもWindows10からメモ帳の文字コードのデフォルトが「UTF-8」になりました。
ただ、Windowsのアプリでは「⑦CP932(Windows-31J)」で保存されるケースも多く、「encoding ='cp932'」の方が便利な場合もあります。
「⑧JIS X 0208-1997」は「encoding ='shift_jis'」で文字コードを指定するため、見慣れたshift_jisの名前につられて使ってしまう可能性がありますが、使用するメリットは少ないと思います。
5.文字コードの見分け方
では、開きたいファイルの文字コードが分からない場合は、どのように確認すればよいのでしょうか。
(1) テキストエディタで開く
テキストエディタ(メモ帳やサクラエディタなど)で開くと下の方に文字コードが表示されます。
ただ、どの「Shift JIS」かは分かりませんし、Windows標準のメモ帳の場合は「Shift JIS」が「ANSI」と表示されてしまいます。
(2) 対応できる文字で見分ける
「⑥JIS X0208-1990」と「⑧JIS X0208-1997」は扱える文字が同じなので区別できませんが、その他は「凜」「㌧」「髙」「俱」「𠮷」の5文字の対応を調べれば判別することができます。


コード01は、私が文字コードの対応を確かめたコードです。確かめたい文字コードの「#」を記入したり外したりして使いました。Pythonでは、扱えない文字を入出力しようとするとエラーになります。
#コード01
import os
path = os.getcwd()
#with open(path+'\\dir_data\\output_data3.txt', 'w') as f:
#with open(path+'\\dir_data\\output_data3.txt', 'w', encoding = 'shift_jis') as f:
#with open(path+'\\dir_data\\output_data3.txt', 'w', encoding = ' shift_jisx0213') as f:
#with open(path+'\\dir_data\\output_data3.txt', 'w', encoding = 'shift_jis_2004') as f:
#with open(path+'\\dir_data\\output_data3.txt', 'w', encoding = 'cp932') as f:
with open(path+'\\dir_data\\output_data3.txt', 'w', encoding = 'utf-8') as f:
print('abc', file = f)
print('計算結果', file = f)
print('計算結果凜', file = f)
print('計算結果㌧', file = f)
print('計算結果髙', file = f)
print('計算結果俱', file = f)
print('計算結果𠮷', file = f)
print('----')
import os
path = os.getcwd() #カレントディレクトリを取得
#f = open(path+'\\dir_data\\output_data3.txt','r')
#f = open(path+'\\dir_data\\output_data3.txt','r', encoding='shift_jis')
#f = open(path+'\\dir_data\\output_data3.txt','r', encoding='shift_jisx0213')
#f = open(path+'\\dir_data\\output_data3.txt','r', encoding='shift_jis_2004')
#f = open(path+'\\dir_data\\output_data3.txt','r', encoding='cp932')
f = open(path+'\\dir_data\\output_data3.txt','r', encoding='utf-8')
s = f.read()
print(s)
f.close()
6.参考記事
以下、参考にした資料です。
(1) Wikipedia
・Shift_JIS
・Microsoftコードページ932
・JIS X 0208
・JIS X 0213
・Shift_JIS-2004
(2) Python標準ライブラリ
私が実際に購入した教材のご紹介
以下、私が実際に購入したPythonの教材をまとめてみました。 Pythonを学習する上で、少しでもお役に立つことができればうれしいです。
・Python♪私が購入したPythonの書籍のレビュー
・UdemyのPythonの動画講座を書籍を買う感覚で購入してみた
その他
液晶ペンタブレットを買いました
(1) モバイルディスプレイを買うつもりだったのに激安ペンタブレット購入
以下、私が光回線を導入した時の記事一覧です。
(1) 2020年「光回線は値段で選ぶ」では後悔する ←宅内工事の状況も説明しています。
(2) NURO光の開通までWiFiルーターを格安レンタルできる
(3) NURO光の屋外工事の状況をご紹介。その日に開通!
(4) 光回線開通!実測するとNURO光はやっぱり速かった
(5) ネット上のNURO光紹介特典は個人情報がもれないの?