criticablog

ソフトウェアエンジニアがニッチな情報を書きます。

Windows の文字コードは Python では cp932

結論:

日本語 Windows*1 のメモ帳に環境依存文字 \~①Ⅰⅰ咩﨑瀨髙 を貼り付けてANSI文字コード *2 で保存したら、

%  od -tx1 -Ax sjis.txt
0000000    5c  7e  87  40  87  54  fa  40  fa  93  fa  b1  fb  50  fb  fc
0000010

というバイト列になります。これを codecs ライブラリで 'shift_jis', 'shift_jisx0213', 'shift_jis_2004', 'cp932'(= 'ms932')と指定して読み込んでみましょう。

%  /Library/Frameworks/Python.framework/Versions/3.6/bin/python3
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 26 2018, 19:50:54)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import codecs
>>> codecs.open('sjis.txt',"rb",'Shift_JIS').read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/codecs.py", line 700, in read
    return self.reader.read(size)
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x87 in position 2: illegal multibyte sequence
>>> codecs.open('sjis.txt',"rb",'Shift_JISx0213').read()
'¥‾①Ⅰ豗迠郫鍚騠'
>>> codecs.open('sjis.txt',"rb",'Shift_JIS_2004').read()
'¥‾①Ⅰ豗迠郫鍚騠'
>>> codecs.open('sjis.txt',"rb",'cp932').read()
'\\~①Ⅰⅰ咩﨑瀨髙'

'shift_jisx0213', 'shift_jis_2004' を使うと丸付き数字や大文字ローマ数字は合っていますが、立ち崎、はしご高、など名字に使われるIBM拡張文字、バックスラッシュやチルダが文字化けします。バックスラッシュ 0x5c が円記号 U+00A5 に化けているのでとても困りますね。

JIS X 0208と0213と機種依存文字

Shift_JIS-2004 では第2面の文字を F0-FC を第一バイトとするコードに割り当てました。その結果、Shift_JIS-2004 を採用すると 115-119区のIBM拡張文字も別の文字に替わってしまいます。

Shift_JIS系文字一覧イメージとSJIS・MS932・CP943の違い - instant tools

JIS X 0213ベースの拡張Shift_JIS)あえて使うことはほとんどない。

Windows Vista 以降 文字集合 JIS X 0213(:2004) に対応したという情報*3 があったり、丸付き数字やローマ数字が変換に成功しただけで Shift_JIS の代わりに Shift_JIS X 0213(:2004) を使おうという誤解が多々見受けられます。

しかし、Shift_JIS X 0213(:2004) を採用したシステムは非常に稀であり、私は知りません。どなたかご存知だったら教えてください。例えばブラウザでも macOS 版 Safari が Shift_JIS_X0213-2000 に対応しているのみです。

*1:Windows 10 の場合、システム ロケールを日本語 (日本) にして、「ベータ:ワールドワイド言語サポートで Unicode UTF-8を使用」をオフにしている状態。私は普段これを有効にしているが、今回の実験のためにオフにした。

*2:HTTP/HTMLの世界でいう Windows-31J

*3:Windows Vista は(UnicodeJIS X 0213:2004 が含まれているし)フォントを JIS X 0213:2004 の例示字体に合わせていることをもって JIS X 0213:2004 対応したって言ってる感じですか?? 小形克宏の「文字の海、ビットの舟」