CCSIDとは何か？に対してシュッと回答できるようになろう　Part1

# 前置き:raised_hand:
- 私は開発業務を行っていた頃、QCCSIDは5026環境、ホストコードページは930を設定して開発をしていました
- 「5026って？ホストコードページって？CCSIDって？EBCDICって？」最初は疑問に思っていたものの、日々の業務に追われ（以下略　腹落ちした、という感覚がないまま、なんとなくわかった気になっていました
- 大変ありがたいことに、@gomAnomalocarisさんよりご教示いただく機会がございましたので、勉強記録と私の理解をアウトプットさせていただきます

# （私の）目標:triangular_flag_on_post:
- IBM i をIBM i を知らない方、知っているけど経験が浅い方にも理解しやすい！と思ってもらえるようなアウトプット（記事）を作成する

# 1. CCSID誕生:baby:
- 文字コード体系が様々な経路で発展し、膨大な数の文字コードの種類が生まれた
- 生まれたのは良いが、膨大な数が影響し、メーカーや業界によって文字コードや体系が異なった
    - 即ち、データを別システムへ連携した際に表示したい文字ではない文字に変換されてしまった
- IBMはすべてのシステムを通した整合性のある文字コード提供のため、`CDRA: Character Data Representation Architecture` という文字コードのアーキテクチャーを提唱した
- CDRAを用いて文字コードを一意に識別するためのメカニズムを提供したのが、`CCSID: Coded Character Set Identifiers`
- CCSIDは、文字コードをユニークに識別するためのIDのこと

# 2. CCSIDの構成
- CCSIDは以下の3つの要素を組み合わせで構成されている
- CCSID = CS(Character Set：文字セット) × CP(Code Page：コードページ) × ES(Encoding Scheme)
    - 3要素のうち1つでも異なれば、違うCCSIDとなる

## 2.1 CS
- CS（Character Set：文字セット) は、 CCSIDが規定される以前から、文字コードや文字セットとして標準化されていたのが、1.CCSIDの誕生の通り、業界・メーカーによって異なり標準化が進んでいなかった
- 文字の一つ一つには、識別する番号があり、この番号をGCGID（Graphic Character Global Identifier）と呼ぶ
    - 名前の通りユニーク
    - 以下の例は文字（グラフィック）とGCGIDの対応表
    
    | グラフィック | GCGID |
    |:-:|:-:|
    | A  | LA020000  |
    | 五 | I0QT0080 |
- CSは、GCGID群をグループ化したもののこと
    - CSの具体例は、1172 1027等がある
    - 一旦ここまで理解すればOK

## 2.2 CP
- CP（Code Page：コード・ページ) は、CS（文字セット）で定義された文字の集合に対して、それぞれの文字に対して割り当てられたコードポイントの集合を指す
    - :raised_hand:CPは文字の変換テーブルのこと
- 1バイト或いは複数バイトで表示される16進コードのことで、特定のCSに含まれる文字を、それぞれのユニークなコード・ポイント（座標位置）に関連付けたもの
    - CP(コード・ページ）は、CPGID(Code Page Global Identifier）でユニークに識別される
- CS（文字セット）とCP（コード・ページ）の対で、あるコード・ポイント（座標位置）がどの文字を表すかが決まる
– CP(コード・ページ）には、番号がつけられているが、番号のつけ方は、各ベンダーによって異なる
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/375dbd9e-f41c-16d8-cf28-4c8fb03d6799.png)
 
## 2.3 ES
- ES（Encoding Scheme：コード化スキーマ）は、CP（コードページ）に対してどのようなコード化規則によってできているかを表す
- 例
    - 「EBCDICかASCIIか」や、DBCS(漢字）を表わすのに、SO(x’0F’), SI(x’0E’)を使用するのか使用しない等
    -CCSIDの有名どころ、5026、5035、939、930はすべて1301であることをおさえておきましょう
    
    | ES | 説明 |
    |:-:|:-:|
    | 1100  | EBCDIC,SBCS,SO/SIなし  |
    | 2100  | IBM PCデータ、SBCS,SO/SIなし  |
    | 1301  | EBCDICSBCSとDBCSの混在、SO/SIあり  |
    | 2300  | IBM PCデータ、SBCSとDBCSの混在、SO/SIなし  |
    | 4403  | IBM EUC(ISO-8)  |

# 3. SBCSとDBCS
- 「2Byte文字のことをDBCS、1Byte文字をSBCSって言うのは知っている」くらいの理解から、もう少し踏み込むと…
    - SBCSとDBCSは何が違うのかの回答は「CS（文字セット）もCP（コード・ページ）が違う」ということ
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/1c1797e0-dc72-eb87-27c4-6122f550bace.png)
- 表にまとめるとこんな感じ
    - 5026/930
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/4f17c75d-e5ba-01ae-39c4-259691b83277.png)
    - 5035/939
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/2044d6e0-d75f-cf4a-280d-f10790bfa753.png)
- ここでのポイントは、CS→CP→ESの流れを見ると、5026と930、5035と939はそれぞれSBCSのルート同じで、DBCSは5026、5035、939、930すべてルートが同じということ
- ん・・・？上記にこんなことが書いてあったような・・・？と思いますよね
>- CCSID = CS(Character Set：文字セット) × CP(Code Page：コードページ) × ES(Encoding Scheme)
    - 3要素のうち1つでも異なれば、違うCCSIDとなる
    
- ナイス違和感です。このタイミングで2Byte文字を使う場合は、SBCSとDBCSセットにした際に、CS(Character Set：文字セット) × CP(Code Page：コードページ) × ES(Encoding Scheme)が1つでも異なれば違うCCSIDとなる、と覚えなおしましょう！



# おわりに
- もやもやしていたものが少しずつ分かってくるはずです。混乱してきましたか？
- Part2でもう少し深堀していきます！