最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

3.13.CCSIDの不思議な話(前編)

[ Previous ] [ HOME ] [ Upper ] [ Next ]


皆さんは、いつのころからか、CCSIDというなんだか、得体の知れないIDらしきものを聞いたことがないでしょうか。聞いたともないし、使ったことも、設定したこともない人は、幸せ者です。そういう、ラッキーな方はこのページは無視してください。

実は、なんか、よく分からないんだ、というあなたのためのページです。System38から現在に至るまで、これほどややこしくて、身近な内容はないと思います。これって、いったいなんでしょう。

今を去る、数年前、IBM主催の新バージョン(新リリースだったかもしれない)の発表会で、突如「これからは、カタカナと英語の小文字を、(切り替えないで)同時に使えるんです」と言っていたIBMの人の「頼むから突っ込んで聞いてくるなよ」といわんばかりの鬼気迫る顔と、なんだか分かったような、分からないような顔で首をかしげていたほとんど全員の出席者、どうも、あの頃から、おかしくなりだしたような気がします。まあ、これは新しいコードページのことだったんだろうと、今では思うけど、広く、あらゆる言語を何とか、AS/400で取り込めるように考え出していた、IBMは、CCSIDをデータにタグ付けしようと考え出していたわけで。National Language Supportがその具体的なサービスです。この、カタカナ+英小文字は、コードページ1027のことだと思いますが、後述します。まあ、記憶をたどれば、CCSIDって、オープンネスを担保するためにあるともいえますよね。AS/400とオープンネス、水と油のたとえを思い浮かべたのは、私一人だったでしょうか...でも確かに、TCPIPの接続は便利だし、それが無かったら、今ごろ、AS/400は、消えてなくなったかもしれないので、トレンドの変わりやすい業界では、正しい選択だったのでしょう。

前提知識を取り入れましょう

CCSIDの理解

文字コードの動向の理解

CCSIDを知る

まず、このCCSIDは、大きな概念として、CDRAという体系の一部で、ISOのような世界標準規格ではなく、IBMの制定した標準のひとつです。したがって、CCSIDによって制御できる範囲は、IBM製品の範囲内にとどまると思います。ここで私が言わんとしているのは、たとえば、ネットスケープのブラウザそのものの設定には、CCSIDなんて「用語」は出てきません。(勿論、文字コードセットの指定は出きます)。

2.2 文字データ表現体系 (CDRA)

文字データ表現体系 (CDRA) は IBM の体系です。CDRA を使用すると、AS/400 システム内で、および CDRA をサポートする複数の IBM システム環境にまたがっ て、文字(データ)の一貫性のある表現、処理、および交換を行うことができま す。 CDRA の詳細については、トピック4.0の第4章, 『文字データ表現体系の実現』を参照してください。

サブトピック 

2.2.1 文字データ表現識別コード 

2.2.2 長形式識別コード 

2.2.3 短形式識別コード (CCSID)

というようにマニュアルに出ていますね。

OS/400 国別言語サポート バージョン 3 資料番号 SC88-5238-00

  • 4.1 CCSID に関する一般的な推奨事項

    • システムは、65535 の省略時 CCSID を持って出荷されるため、通常、適用業 務内では文字データ変換は起こりません。ただし、システムがネットワークに 参加するか、もしくは後でデータを交換する可能性があるため、本書の CCSID 情報に目を通しておいてください。
    • 独自のマッピング・スキーマを実施する適用業務では、CCSID 65535 を使用し なければならず、CCSID 割当てが必要とされます。たとえば、適用業務の内容 によって、ファイルのために CCSID 65535 を使用することが必要な場合もあ りますし、ジョブのために CCSID 65535 を使用することが必要な場合もあり ます。そのような適用業務は、他の適用業務が 65535 以外の CCSID を必要と する場合があるため、マッピング・スキーマを CCSID サポートに置き換える ことによって変更することを検討してください。
    • フィールドは、それの用途に基づいて正しく定義してください。フィールドに 適用業務従属値(たとえば、制御文字や、実際の文字フィールドとして使用さ れないフィールドなど)が含まれる場合には、 CCSID 65535 を使用すること によってフィールドを 16 進データとして定義してください。
    • プログラム内の名前およびリテラルに、不変文字セットに入っていない文字を 使用することは避けてください。
    • S/36 環境を実行している場合は、手続きソース・ファイル (QS36PRC) の CCSID がジョブの CCSID と一致しなければなりません。そうでなければ、い ずれかの CCSID が 65535 に設定される可能性があります。
  • 4.1.1 CCSID の使用に関する規則および指針

    • CCSID は、多国語適用業務で、データベース・ファイル、表示装置、および印刷データ内の文字の完全性を保つために使用してください。
    • QIGC システム値がオンに設定される場合には、QCCSID を混合 CCSID または 65535 として設定してください。 QIGC の詳細については、トピック3.1.10の 『DBCS システム標識 (QIGC) システム値の使用』を参照してください。
    • DBCS サポートを使用する場合には、ジョブの CCSID を混合 CCSID または CCSID 65535 として設定してください。
    • QCHRID コード・ページは、 QCCSID 値が 65535 でない限り、 QCCSID 値の文字セットおよびコード・ページと互換性がなければなりません。QCCSID 値が 現行の QCHRID 値と互換性がない値に変更される場合、QCHRID 値はシステム によって互換性のある値に変更されます。
    • ユーザー定義のデータ・ストリーム (UDDS) を使用する場合は、CCSID 変換に よって挿入された X'3F 値を除去してください。そうしなければ、そのデータ によって、システムが画面を消去する可能性があります。
    • 一部の CCSID 変換では、置換文字に X'3F' 値を使用します。システム定義の データ・ストリームは、変換されたデータから自動的に X'3F 値を除去しま す。X'3F' 値が除去されるのは、システムが X'3F 値を画面を消去する目的で 使用するためです。
    • AD TOOLSET/400 などの対話式ジョブを使用している場合には、ジョブの CCSID がキーボードのコード・ページと一致しなければなりません。これらの CCSID 値が一致していないか、またはジョブの CCSID が 65535 である場合 は、予測外の結果が生じる可能性があります。(詳細については、付録C, 『国別言語のキーボード・タイプおよび SBCS コード・ページ』および トピ ック9.4の『適用業務開発ツール・セット/400 ライセンス・プログラム』を参 照してください。)
    • *JOBCCSID サポートは、システム提供の表示装置またはパネル・グループでは 使用されないことに注意してください。
    • データベース・ファイルが、別々の 1 次国別言語バージョンを持つ複数の AS/400 システムがあるネットワーク内で分散されている場合には、制御情報 として定義または指定されている文字データを知っておいてください。この状 態が存在する場合は、ジョブの CCSID を 65535 として指定するか、または CHGPF(物理ファイルの変更)コマンドを使用して物理ファイルの CCSID を 65535 に変更する必要があります。制御情報に関しては変換の必要はありませ ん。
    • 新規のデータベース・ファイルの場合、制御情報を含むフィールドは、文字フ ィールドではなく 16 進数フィールドを使用する必要があります。
    • 同じ文字セットを使用している言語間で変換を行う際に、すべての文字データ が表示されるようにしたい場合には、 3486、3487、3488、またはパーソナ ル・システム/2 (Personal System/2*) (PS/2*) 表示装置を使用してくださ い。ワークステーション・ハードウェアの制限のために、他の表示装置では、 CCSID 変換が行われる際にすべての文字が表示されない可能性があります。た だし、文字データはシステム内に保管されています。
    • CCSID 変換が行われる際に、置換文字によってデータの消失が起こる可能性の あることに注意してください。この状態は、強制サブセット突合せ変換が行わ れる場合に生じます(トピック2.3の『変換』を参照してください)。

CCSIDの役割

CCSIDとは、Coded Character Set Identifiersのことです。「コード化文字セット識別コード」と訳されるようです。

※ identifier

《名》
【名-1】確認者,鑑定人{かんていにん},名前識別子、鑑定人
【名-2】《コ》識別子、一意名

そもそも、一口にEBCDICといっても、さまざまな国の言語バージョンがあります。情報処理試験の参考書に出ているEBCDICのコード表は、たいていは、日本語のものですが、この他にも、アメリカ、フランス、ドイツ、スペイン、メキシコ、などなど、たくさんの言語に対する、たくさんのEBCDICの「バージョン」があるのです。たくさんの文字コードテーブルが既定されているのです。基本的な大文字のアルファベットは、共通のコードを割り当てられていますが、その他、その国の言語により、ローカライズが図られています。これは、重要なことで、IBM製品がどれだけ多くの国に使用されていて、高々、一国か二国に的を絞ったマシンでは、考えることもできないくらい、柔軟な対応を可能としています。もし、あなたが、日本人なら、日本語のEBCDICがメインでしょう。もし、あなたが、フランス人ならフランス語のEBCDICがメインでしょう。もしあなたが、ドイツ人なら...と、メインとなる言語は、ユーザーによりまちまちです。

ところが、このコードも、体系(マトリックス)が予め決まっているのですが、あるコードでは、コード体系上ある部分が、「通貨記号」で、ある言語では、それは、まったく別の部分に割り当てられている、ということがあります。つまり、

ある言語の「EBCDIC」のコードを、無条件に、意味を考えずに、そのまま、別の言語に当てはめると、文字としての同一性が失われ、意味が分からなくなることがあるのです。

これを解決できる手段は、予め、2つのEBCDICマトリックスの一つ一つの要素を、きちんと整理して、片方の通貨記号は、もう片方のここ、という紐付けをしておけば、ある言語のEBCDICをフィルターにかけて、別言語のEBCDICにできますね。これが、CCSIDの基本的な働きです。「翻訳」をしてくれるのです。まあ、「変換」でもいいでしょう。とにかく、見る人の環境の「何か」をキーワードにして、ソースとなるデータのEBCDICコードを、ターゲットとなるEBCDICに「翻訳」「変換」を、勝手にしてくれる、フィルター機能ということです。API:iconv()はCCSIDのエンジンなので、参照してみてください。CCSIDがどんなことをするのかが、明確に分かると思います。また、注意すべきは、CCSIDという言葉に、「ID」という言葉が入っていることです。CCSIDは、ひとつの識別コード認識要素です。

CCSIDの構成

CCSIDは、以下のコードをまとめた、セットになっています。

文字セット(Character Set:CS) 

図形文字番号(Graphic character ID:GCGID)の集合のこと。

Aは、LA020000という図形番号が割り当てられている。文字のビットマップ的な構成とも言える。これを最小の部品として、色々な文字セットを構成する要素です。

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

上記の図形番号が、なんと言う文字コードに結びついているか、をまとめたものです。

コード化スキーマ(Encoding Scheme:ES) 

scheme 《名》一覧表,陰謀,概要,計画,考え,(悪い)企み,仕組み,図式,組織,理論体系

コード化するにあたっての、統一的な、方法を決めたものです。コードによって、そのコード化が決まっています。

CCSIDを理解するにあたっては、たとえば、図形番号を中心に、あるコード表では、ここで、またあるコード表では、ここに定義されている、などと、考えると、分かりやすいです。逆に、あるテーブルのこのアドレスには、この文字、また、別のテーブルの同じアドレスには、あの文字、とか考えていると、頭が変になりそうです。

CCSID 文字セット
CS
コード・ページ
CP
コード化スキーマ
ES
1027 1172 1027 1100
290 1172 290 1100
37 697 37 1100
897 1122 897 2100

CCSIDはデータのタグ

データは、CCSIDというタグをつけられるようになりました。データの属性のひとつに、CCSIDが入ったわけです。AS/400上、意味をなすデータの最小単位はフィールドになるのですが、DDSキーワードでCCSIDがあり、フィールド別にCCSIDのタグ付けを可能にしています。ただし、このフィールド別のCCSIDがどこまで有効なのか、不明です。フィールド情報を参照しないツール(FTPなど)では、無視されてしまうでしょう。なんと言うか、まだ、CCSIDの機能そのものが、きっちりと染込んでいないような気がします。(V4R4現在)。

CCSIDと日本語の関係

SBCSの場合、CCSIDは単純なCCSIDなのですが、DBCSだと、実際が、SBCS+DBCSの処理となるために、CCSIDもSBCS+DBCSの混合のCCSIDとなります。

3.1.10 DBCS システム標識 (QIGC) システム値の使用

DBCS システム標識 (QIGC) は、 DBCS 国別言語バージョンが導入されているかどうかを指定するために使用されます。この値は、1 次国別言語バージョンが導入されるときに設定されます。

QIGC が 0 に設定されている場合は、システムに DBCS 国別言語バージョンが導入されていません。QIGC が 0 に設定されているときには、コード化文字セット・システム識別コード (QCCSID) を SBCS コード化文字セット識別コードに設定しなければなりません。

QIGC が 1 に設定されている場合は、DBCS 国別言語バージョンが 1 次言語としてシステムに導入されています。 DBCS システム標識システム値が 1 に設定されているときには、コード化文字セット・システム識別コード (QCCSID) システム値を混合 CCSID(05026 など)または CCSID 65535 に設定しなければなりません。

この値を変更することはできません。

※なお、QIGCは、このCCSID以外でも参照されていますよ。

CCSID 文字セット コード・ページ コード化スキーマ
5035 1172と370 ※1027と300 1300
5026 1172と370 290と300 1300
943 1122と370 897と301 2300

※コードページ1027について

Code Page 00037

従来使われてきている、コードページ290もここにあげます。CCSIDの5026で使われているコードです。よく見てください。コードページ37で英語の小文字の割り当てられている部分が、290ではカタカナになっていますね。つまり、37で英語の小文字部分が、290ではカタカナにかぶってしまっています。

Code Page 00290

CodePage37は、一般的なEBCDICの英語のコードページです。この表を、下の1027と比較すると、記号の部分がカタカナに変わっているのが分かりますね。こうやって、コードページ37の英語の大文字小文字の配列を保持しつつ、カタカナを、オーバーラップすることなしに、1027という同一のコードページに押し込んだ、のです。これが、CCSID5035です。

Code Page 01027

CCSIDは筋がとおらない

どうも、CCSIDには、いろいろなルールがあったり、ジョブログやヘルプをよく見ないと、意図したとおりにならず、CCSIDが不可思議で、触りたくない生き物のような、イメージを受けます。もっと、最初からちゃんと教えてくれれば、迷わないのに。マニュアルも、あまり、まとまっていないので、苦労します。ここでは、なるべく、最初に知っておくと、いいものをあげました。

なお、DBCS(日本語)ファイルとは、結果的にファイルのIGCDTAが*YESになる場合のことです。「o混合」「J専用」「E択一」「G図形」などが含まれるか、直接、IGCDTA(*YES)とした場合などです。

ジョブ属性のCCSIDについて

実は、CCSIDの最大の難点が、ここにあります。実は、変換そのものの概念は、大体推理できる範囲です。しかし、その中で、決定因子が、自動的に(勝手に)決まってしまう部分があるのです。

まずは、ジョブ属性のCCSIDの決まり方からみて行きましょう。

SC88-5238-00

3.5.1 コード化文字セット識別コード・ジョブ属性

対話式ジョブが開始されるときには、ジョブの CCSID 値はSBMJOB コマンドから取られます。バッチ・ジョブが開始されるときには、BCHJOB コマンドで CCSID が明 示的に入力されない限り、現行のジョブの CCSID が使用されます。

この一文で、「はあ???」と思いませんか?なんで、対話式ジョブが、SBMJOBで決まるの?で、英語のマニュアルを見ると、

SC41-3101-00

3.5.1 Coded Character Set Identifier Job Attribute

When an interactive job is started, the job CCSID value is taken from the SBMJOB command. When a batch job is started, the current job CCSID is used unless a CCSID is specifically entered on the BCHJOB command.

よく調べたら、旧英語版のマニュアルがおかしい表現でした。マニュアルのバグですね。V4R2で調べたら、以下のように書き換わっていました。ユーザープロファイルから取り出されるのですね。混合CCSIDが採用されるフラグが、QIGCであるという説明も見ておいてください。

※はやく、翻訳してください>IBM。

SC41-5101-01

3.5.1 Coded Character Set Identifier Job Attribute

When an interactive job is started, the job CCSID value is taken from the user profile. When a batch job is started, the current job CCSID is used unless a CCSID is specifically entered on the BCHJOB command.

For every mixed-byte coded character set CCSID, there is a corresponding SBCS CCSID that is valid. If you specify a mixed-byte coded character set CCSID for an SBCS system, the job CCSID is changed to the corresponding SBCS CCSID.

If a job CCSID is specified as an SBCS CCSID, the job cannot handle DBCS data. If a job CCSID is specified as a mixed CCSID, the job can handle DBCS data. You must use a DBCS-capable display device, though, for the DBCS data in a job to display correctly. You can specify a mixed-byte CCSID for a job only if the DBCS system value (QIGC) value is set to 1 (on). A QIGC value of 1 indicates that a DBCS national language version is installed on the system

さらに、

対話式ジョブの場合、実行管理サポートは、ジョブが開始されるときにジョブの CCSID をユーザー・プロファイル上の CCSID に初期設定します。

.この日本語見て、しっかり理解できますか?まあ、上記のマニュアルを見ていれば、言わんとすることは分かりますよね。「ユーザープロファイルのCCSIDが初期値となって、ジョブが開始される」、のですよね。

「ユーザー・プロファイル上の CCSID 初期設定」って変ではないですか?これは、原文を見れば分かります。

Work management support initializes the job CCSID for an interactive job to the CCSID on the user profile when the job starts.

... to the CCSIDのtoを、「に」と訳したので、なんだか分からなくなったのですね。toと言う前置詞は、方向のある動きの終点を意味しています。だから、駅に行く、の「に」を当てたのでしょう。まあ、そこまで分かれば、「ユーザー・プロファイル上の CCSID 初期設定」でも分かりますね。でも、初めて読んだときは、なんだか妙な気がしませんでしたか?「ユーザー・プロファイル上の CCSID になるように初期設定」のほうがいいかもしれません。でも、マニュアルを意訳しているかもしれません。もともとの英語表現が、翻訳に適していないかもしれません。マニュアルのオリジナル作成には、もっと、言語学者のサポートが要るのではないだろうか...(半分冗談)

データベース上のCCSIDについて

ここでも注意しないと、いきなり、落とし穴に落ちて、ひどい怪我をすることがあります。

CCSIDの罠1

G.6 言語識別コードおよび対応する省略時 CCSID 

言語識別コード 1 バイト CCSID 混合バイトCCSID 
JPN  00290 05026 

日本語カタカナ  ジョブの CCSID が 65535 である場合には、DFTCCSID の混合バイト値は 05026 です。DFTCCSID を 05035 にするためには、ジョブの CCSIDが 05035 でなければなりません

CCSIDの罠2

CRTPFでのCCSIDの指定で、レコード長のみ指定した、DDS無しのファイルで、通常の物理ファイルは、必ず、65535になるようです。これが、いまだに、私としては、理屈がわかりません。どうして無変換にしたんだろう。

コード化文字セット ID (CCSID) −ヘルプ

ファイルのフィールドの文字データを記述するために使用するコード化文字セッ ト識別コード (CCSID) を指定します。

このパラメーターを適用できるのは, ソース・ファイル プロンプト (SRCFILE パラメーター)に DDS が指定されていない場合と レコード長 プ ロンプト (RCDLEN パラメーター)に値が指定されている場合だけです。このパ ラメーターに省略時の値 (*JOB) 以外の値を指定した場合には, SRCFILE パラ メーターに指定された省略時の DDS は使用されず, RCDLEN パラメーターに値 を指定しなければなりません。

注 : FILETYPE(*DATA) を指定した時に DDS なしで作成されるファイル は,そのジョブの CCSID の値と関係なく, 65535 の CCSID をもちます。

指定できる値は次の通りです。 

*JOB : 現行ジョブの省略時の CCSID が使用されます。 

*HEX : CCSID 65535 が使用されます。これは,フィールドの文字データがビット・データとして扱われ,変換されないことを示します。

コード化文字セット識別コード : 使用される CCSID を指定します。 CCSID の詳細は NATIONAL LANGUAGE : SUPPORT (SC41-5101) にあります。 

続く...

2000-11-4


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送