Shift_JIS と CP932 の違いについて徹底解説

# Shift_JIS と CP932 の違いについて徹底解説

日本語のエンコードを扱う際に **Shift_JIS** を選択していたはずなのに、うまくデコードできない問題に直面したことはありませんか？ 実は、多くの Windows 環境では **CP932 (Windows-31J)** という Microsoft 独自の拡張エンコードが使用されており、これが原因でエンコードの不整合が発生することがあります。本記事では、Shift_JIS と CP932 の違いを具体例を交えながら詳しく解説します。

**注意：以下の記事はしっかりと参考文献を漁ったわけではないので、間違え等あるかも知れません。その際は、ご指摘お願い致します。**

---

## 1. Shift_JIS と CP932 の基本的な違い

### **Shift_JIS (シフトJIS)**
- **定義**: 日本工業規格 (JIS) に準拠し、JIS X 0201（半角カナ）と JIS X 0208（第1・第2水準漢字）を組み合わせた文字コード。
- **用途**: JIS規格に準拠した日本語エンコーディング。
- **収録文字**: JIS X 0208 に含まれる漢字・記号のみ。

### **CP932 (Windows-31J)**
- **定義**: Microsoft が Shift_JIS を拡張し、独自の文字セット（NEC特殊文字、IBM拡張文字など）を追加した文字コード。
- **用途**: Windows 環境での標準的な日本語エンコーディング。
- **収録文字**: Shift_JIS に含まれない拡張文字（NEC特殊文字、IBM拡張文字、独自記号など）が追加。

CP932 は Windows に最適化されているため、**Windows で「Shift_JIS」として保存しても、実際には CP932 が使用されている** ことが多い点に注意が必要です。

---

## 2. 具体的な違い

### (1) **収録文字の違い**
Shift_JIS には存在せず、CP932 に追加されている文字があります。

#### **① NEC特殊文字**
CP932 に追加されたが、Shift_JIS には存在しない記号類。

| 文字 | 説明 | Shift_JIS (JIS) | CP932 (Windows-31J) |
|------|------|----------------|-------------------|
| ① | 丸付き数字1 | ❌ (存在しない) | ✅ (存在する) |
| ㈱ | 株式会社記号 | ❌ | ✅ |
| ㎜ | ミリメートル記号 | ❌ | ✅ |

➡ Windows で **「①」や「㈱」を含むテキストを Shift_JIS で保存** すると、正しく表示されない可能性があります。

#### **② NEC選定IBM拡張文字**
NEC と IBM が選定した拡張漢字の一部。

| 文字 | 説明 | Shift_JIS (JIS) | CP932 (Windows-31J) |
|------|------|----------------|-------------------|
| 龍 | 「竜」の異体字 | ❌ | ✅ |
| 彌 | 「弥」の旧字体 | ❌ | ✅ |
| 塡 | 「填」の異体字 | ❌ | ✅ |

➡ Windows のメモ帳などで **「龍」などを含むテキストを Shift_JIS で保存すると、別の文字に置き換わるか、文字化けする可能性** があります。

---

### (2) **符号化の違い**
Shift_JIS と CP932 は基本的な符号化ルールは共通していますが、CP932 では追加文字のために未使用だったバイト領域が使用されています。

#### **③ "①" (丸付き1) のエンコーディング**
| 文字 | Shift_JIS のバイト列 | CP932 のバイト列 |
|------|----------------|----------------|
| ① | 未定義 (存在しない) | `0x87 0x40` |

➡ Shift_JIS では "①" をエンコードできず、**? になったり、文字化けしたりする** 可能性があります。

#### **④ "龍" (旧字体) のエンコーディング**
| 文字 | Shift_JIS のバイト列 | CP932 のバイト列 |
|------|----------------|----------------|
| 龍 | 未定義 (存在しない) | `0xE9 0x9A` |

➡ Shift_JIS では "龍" をエンコードできず、**? になったり、置き換えられたりする** 可能性があります。

---

### (3) **実際の使用環境**
**Windows のファイル保存時の挙動**
- Windows の「メモ帳」や Excel で Shift_JIS で保存すると、**CP932 の拡張文字は失われる可能性がある**。
- 特に、"①" や "㈱" などの記号、"龍" などの漢字が化ける。
- **Windows では「Shift_JIS」として扱われるエンコーディングが、実際には CP932 である** ことが多い。

---

## 3. まとめ

| 違い | Shift_JIS (JIS) | CP932 (Windows-31J) |
|------|---------------|------------------|
| 規格 | JIS X 0201, JIS X 0208 に準拠 | Shift_JIS を拡張 |
| NEC特殊文字 | ❌ | ✅ |
| IBM拡張文字 | ❌ | ✅ |
| 独自の記号 (①, ㈱ など) | ❌ | ✅ |
| Windows でのデフォルト | ❌ | ✅ (Windows 環境の "Shift_JIS" は実質 CP932) |

➡ **Windows で Shift_JIS を選択しても、実際には CP932 が使用される** ことがほとんど。  
➡ **純粋な Shift_JIS を使いたい場合は、JIS 規格準拠のエンコーディングを明示的に指定する必要がある**。

---

## 4. 実践的な注意点

1. **Windows 環境では Shift_JIS のつもりでも CP932 が使われる**  
   → 互換性を考慮し、特殊文字の使用に注意する。

2. **Mac や Linux では Shift_JIS の厳密な仕様が使われることが多い**  
   → Windows で作成したファイルを Mac や Linux に移すと、文字化けする可能性がある。

3. **Excel で CP932 のデータを Shift_JIS で保存すると一部の文字が失われる**  
   → 正しく表示されない場合、UTF-8 に変換するのが安全。

---

## 5. 結論

✅ **Shift_JIS は JIS 規格準拠** だが、**CP932 は Windows 用に拡張された Shift_JIS 互換エンコーディング**  
✅ **CP932 には Shift_JIS にはない拡張文字が含まれるため、完全な互換性はない**  
✅ **Windows で「Shift_JIS」を指定すると、実際には CP932 が使用されることが多い**  
✅ **異なる環境（Windows / Mac / Linux）間で Shift_JIS を使う場合は、互換性の問題に注意**  

エンコーディングの違いを理解し、適切に扱うことで文字化けを防ぐことができます。特に、**Windows での Shift_JIS の実態が CP932 であることを意識することが重要** です。