知ってはいるけどよく分かってないCCSIDについての基礎知識

知ってはいるけどよく分かってないCCSIDについての基礎知識

IBM i2024.09.02

CCSICについての基礎知識

はじめに

IBM i上でのシステム開発やシステム運用に携わる人は、おそらくほとんどの方がどこかのタイミングで『CCSID』と呼ばれるIDと出会います。
そして、出会うと同時に、そのCCSIDが『文字データ』の入出力や記録にとても重要な役割を持つことも知るはずです。
むしろ、文字データに関する何らかのトラブルを通じてCCSIDを知る方も多いかも知れません。

CCSIDは、適切に設定されていれば、文字データを正確かつ効率的に取り扱う上で非常に便利な仕組みなのですが、設定を誤ると重大なトラブルを誘引する呪いにも似た何かとなります。

そんな便利でありながらも危険な側面を持つCCSIDの厄介なところは、これだけ重要な要素であるにも関わらず、意外にその体系や構造を知る機会が少ないことです。

多くの方は『CCSIDは文字コードみたいなものでしょ?』という認識だと思いますし、それで概ね間違いもないですし、日常的に使えてしまっている以上問題ないという考え方も精神的には健全です。

とはいえ、もしかするとどこかでお役に立つかも知れませんので、少しだけCCSIDについての理解を深めるために、本コラムにお付き合いください。


CCSIDとは

コンピュータに入力した文字を画面に表示した際、あるいは他のコンピュータに移送した際に、入力時と異なる文字で表示されてしまってはデータの意味が薄らぎます。

そこで、大量に存在する文字それぞれに固有のコード・ポイント(バイト列:1バイトもしくは2バイトのビット構成)を割り当てて、このコード・ポイントが入力されたらこの文字を意味する……といった、文字データの一意性を確保する取り決めが作られました。

とはいえ、世界中のありとあらゆる文字に個別のコード・ポイントを割り振って一元管理する(Unicodeの)実装は、常用の範囲ではほぼ無駄になる膨大なメモリ資源のことを考えると、商用コンピュータの黎明期には非現実的なレベルで贅沢すぎました。

結果として、国や言語ごとに扱う文字を限定して、切り替えて使用する方法が考案されます。

IBMではそれらの設計指針を『CDRA』(Character Data Representation Architecture:文字データ表示体系)と呼び、そのCDRAの中で扱う文字を識別するために使用されるIDが『CCSID』(Coded Character Set Identifiers:コード化文字セットID)です。

簡潔にまとめると、『CCSID』は入力・記録された文字データから文字を復号する際の目印となる識別情報と言えます。

入力した文字データは、8ビットまたは16ビットのコード・ポイントの連なりで記録されますが、コード・ポイントの指し示す文字は国や言語ごとに違います。
一度データの形で保管されたそれらを、また元の文字の形に戻すためには、そのデータがどの言語用の文字を使用しているか、また8ビットあるいは16ビットの区切りはどんなルールで切り替わるのかといった、目印となる情報(CCSID)が必要になる訳です。


CCSID_1

CCSIDの構成要素

CCSIDは下記の3つの要素で構成されています。

  • 文字セット(CS:Character Set)

  • 取り扱う全ての文字の図形(ピクセル配置)を集めたもの

  • コード・ページ(CP:Code Page)

  • 文字セット内の文字図形ひとつひとつにバイト列(コード・ポイント)を割り当てたものの集まり

  • 符号化方式(ES:Encoding Scheme)

  • 文字セットやコード・ページを取り扱う際の取り決め

厳密な例とは言えませんが、CCSIDを『スポーツチーム』で例えるならば、文字セットは『チームに所属する全選手』、コード・ページは『選手と背番号の一覧表』、符号化方式は『背番号は2桁の数字にする』などのチームを編成する上で必要となるルールの様な関係です。

チームに所属していない選手は、いくら背番号があっても試合には出られませんし、逆に背番号が登録されていない選手は、いくらチームに所属していたところで試合に呼ばれることはありません。

なお、日本語の場合、膨大な文字種を表現する必要がありますので、ひとつのCCSIDの中にSBCS(Single Byte Character Set:1バイト文字)用とDBCS(Double Byte Character Set:2バイト文字)用の2つのセットが組み込まれた『混合CCSID』を使用します。

CCSID_2


日本語環境で使用されるCCSID

IBM iの日本語環境でよく使用されるCCSIDは、『5026』、『5035』、『1399』の3種類です。
加えて、OSのデフォルト値である『65535』もよく目にしますが、こちらは『無変換』を意味する特殊なCCSIDとなっており、文字コード的な実体はありませんのでここでは割愛します。

CCSID『5026』と『5035』は古くから使用されているCCSIDです。
日本語環境下のIBM iでは半角カナと半角英小文字を排他的に利用する方式が一般的で、半角カナを使用する場合には半角英小文字を、逆に半角英小文字を使用する場合には半角カナを使用しません。

その際、半角カナを使用するシステムではCCSID『5026』を、また半角英小文字を使用するシステムではCCSID『5035』を設定します。

かつては半角カナを利用するシステムが非常に多かったことに加え、IBM iを日本語環境としてセットアップすると省略時のCCSIDに『5026』が設定されていたことも相まって、CCSID『5026』が事実上の標準設定だったと言えます。

昨今では、Javaなどのオープン系プログラムの活用も増え、大文字・小文字の区別が必要になるシステムも多く、CCSID『5035』やその拡張版のCCSID『1399』を採用する企業も増えています。


<日本語用のCCSIDは混合CCSID>

日本語環境ではSBCS(英文字、半角カナ、数字等)以外にDBCS(漢字やひらがな等)も必要となるため、SBCS用のCCSIDとDBCS用のCCSIDの2種類を併せ持った『混合CCSID』と呼ばれる種類のCCSIDを使用します。

  • 『5026』

  • :SBCS用CCSID『290』+ DBCS用CCSID『4396』

  • 『5035』

  • :SBCS用CCSID『1027』+ DBCS用CCSID『4396』

  • 『1399』

  • :SBCS用CCSID『5123』+ DBCS用CCSID『16684』


それぞれのCCSIDには、それぞれに文字セット(CS)、コード・ページ(CP)、符号化方式(ES)がありますが、ESだけは最終的には混合CCSID用の値が参照されます。

CCSID_3

<SBCS用セットの違い>

それぞれのCCSIDの内訳をよく見ると、CCSID『5026』と『5035』はSBCS用のコード・ページが異なる以外、他は全て同じであることが分かります。

少し深掘りすると、それぞれのCCSIDで採用されているSBCS用のコード・ページ『290』と『1027』は、どちらもIBMが1964年に発表したメインフレーム『System/360』で使用された8ビットの文字コード『EBCDIC』(Extended Binary Coded Decimal Interchange Code:拡張二進化十進コード)に半角カナを追加したものです。

EBCDICは単なる文字セットやコード・ページという括りではなく、それ自体が符号化方式の一部(符号化方式の中で『このCCSIDはEDCDICです』と宣言されている様なイメージ)として扱われますが、同じEBCDICと規定されていても各国の言語ごとに採用される文字が異なるため、共通部分は(制御コード等に割り振られている領域を除けば)アルファベットの大文字と数字、あとは空白を含めた二十数種類程度の基本特殊記号に留まります。

英語版のEBCDIC(コード・ページ『37』)では、共通部分以外のアドレスに英小文字や追加特殊記号(表音記号付き文字等)が割り振られています。

しかし、その追加特殊記号の大半は日本ではほとんど使用する機会がありませんので、追加特殊記号部分のアドレスを活用して半角カナを追加したのがコード・ページ『290』と『1027』です。

両者の違いは、追加特殊文字のアドレス部分に英小文字を移動して、空いた英小文字のアドレスに半角カナを配置したものがコード・ページ『290』で、英小文字のアドレスは英語版と同じまま、追加特殊記号のアドレスに直接半角カナを配置したものがコード・ページ『1027』となっています。

ちなみに、1999年の改定で、コード・ページ『290』と『1027』のアドレス"0xE1"にはユーロ通貨記号(€)が追加されましたが、対応する文字セット『1172』には文字図形の追加が行われていません。そのためCCSID『5026』や『5035』ではユーロ通貨記号を使用できません。

ユーロ通貨記号を使用する場合は、文字セット『1172』を内包する文字セット『65535』を組み合わせて用意されたCCSID『1399』を使用する必要があります。


CCSID_4

CCSID_5

CCSID_6

<DBCS用セットの違い>

次にDBCS用の内訳を眺めてみると、CCSID『5026』、『5035』、『1399』は全て同じコード・ページ『300』を使用していますが、CCSID『1399』だけは文字セットが『370』ではなく『65535』となっていて、他の2つのCCSIDとは異なります。

この文字セット『65535』は『Growing Character Set』(拡張する文字セット)と呼ばれるもので、扱える文字を随時拡張できる特殊な文字セットです。
SBCS用の文字セットも内包して、扱える文字の種類が格段に多いのが特徴です。

具体的には、文字セット『370』で扱える文字が7,265文字なのに対して、文字セット『65535』で扱える文字は現在15,897文字です。

また、使用できるユーザー定義文字(外字)も1,880文字から6,205文字に拡大しています。



CCSID_7

CCSID_8

まとめ

以上がCCSIDの構成的な概要となります。

ひとつひとつ紐解けばCCSIDの構成とその仕組み自体はいたってシンプルに思えます。ですが、実際には根幹のシステム値をひとつ設定すれば終わり……という簡単な代物ではなく、ジョブやデータベースファイルなど、複数の箇所で整合性を考慮しながら設定する必要があります。

また、CCSIDとは別に、文字セット(CS)とコード・ページ(CP)のみで構成された『CHRID』(Character Identifier:文字ID)や、エミュレータのセッションに設定するホスト・コード・ページなど、CCSIDと協調して機能する(似たような)設定値も点在するため、これら全てを適切な組み合わせで設定するのは容易ではありません。

とはいえ、適切に設定できさえすれば、データベースファイルやプログラムの間でのテータ移送の際には、CCSIDを参照して自動的にコード変換が行われる仕組みになっているため、例えばCCSID『5026』のデータベースファイル内に格納された"ア"(0x81)をCCSID『5035』のデータベースファイルに移送すると、5035用の"ア"(0x59)に自動的に変換されますし、便利な仕組みであることは事実です。

上手に活用すれば便利なだけの仕組みですが、設定を誤るとたちまち文字化けという窮地に追い込んでくるCCSID。CCSIDへの深い理解が、文字化けのない素敵なIBM i生活に繋がると信じながら、本コラムは閉じさせて頂きます。

ここまでお読み下さってありがとうございました。



SOLPACが選ばれる理由

WhySOLPAC