メニューボタン
IBM i お役立ち情報2026.09.17

開発者のためのIBM i インフラ入門
- 第2回:IBM i バージョン、ライセンス・プログラム、PTF -

はじめに

松田:「前回は、インフラ入門第一弾としてライセンス・プログラムやPTFなどのお話をしました。今回は、文字コードやCCSID、ホスト・コード・ページのお話になります。柳さん、これらのトピックを学習する意義はなんでしょうか?」

:「はい、これらはIBM i の開発を行ううえで非常に重要です。単にプログラムを作るためだけではなく、WindowsやLinuxなど他のシステムとデータを正しく連携するなど、文字化けなどのトラブルを未然に防ぐために欠かせない『土台』となる知識だからです。ここを理解していないと、最悪の場合、データが壊れて業務に重大な影響を与えてしまうこともあるんですよ。」

渡邊:「恐ろしいですね。IBM i ですと、文字コードをCCSID(Coded Character Set IDentifiers:コード化文字セットID)で表現されますよね。確かに開発には考慮必須な要素だと思いますが、なかなか奥深くて難しいんですよね。」

:「CCSIDについてはすでに別記事でも触れているのでこちらもご参考までに見てみてください。ここではなるべくわかりやすいように説明していきたいと思います。」

松田:「ありがとうございます。今回は文字コードにまつわる色々なお話をしたいと思います。渡邊さん、WindowsやLinuxにおける文字コード事情について教えてください!」

渡邊:「OSとしてお話するとWindowsでは日本語をSJIS(Shift-JIS)、LinuxではEUC-JPで取り扱いますね。」

:「なるほど、プラットフォームごとに異なるのですね。」

松田:「最近ではシステム間連携もありますし、VS CodeやIBM Bobで作ったプログラムをIBM i にアップロードすることもあるので、とても大事なお話です。早速始めましょう。」

CCSID

松田:「渡邊さん、日本国内のIBM i で広く利用されているCCSIDをご存知ですか?」

渡邊:「普段使用している環境がCCSID 5035であることは知っていますが、分かりません。」

松田:「実は、広く利用されているのはCCSID 5026なんです。IBM i がAS/400と呼ばれていた時代に広く普及したことがきっかけと言われています。最近では、CCSID 1399も普及し始めています。」

:「そうですね。もともとは汎用機からきており、汎用機との互換性を保つためにAS/400、今のIBM i でも採用されています。そして松田さんがおっしゃったように、日本語環境では、CCSID 5026 をご利用のユーザーが多いです。
さて、日本語環境で使用するCCSIDは、5026、5035、1399がありますが、これら3つの違いを説明するには、まずこれらの成り立ちを説明するほうが分かりやすいかもしれません。」

:「まず、CCSIDは英語、フランス語、日本語などの国語言語やルールなどによって複数用意されていますが、各国語言語用のCCSIDを設定するために基準とされたCCSIDは英語である CCSID 37になります。さて、日本語用のCCSIDは、もともと 5026 のみでした。
このCCSIDは、英大文字部分は CCSID 37と同じ16進コード・ポイント(16進数で表現する値)で構成されますが、日本は半角カナをメインで使用するだろうという事で、結果的に、CCSID 37 の半角英小文字部分に半角カナが割り振られ、半角 英小文字は別の16進コード・ポイントに割り振られたような形になりました。
OS単体での業務であればそれでも問題はなかったのですが、のちに統合されたサーバーとしてオープン技術が使用されるようになると、基準がCCSID 37 になるため、5026環境では英小文字が正しく認識されないという問題が起きる。そのため、のちにCCSID 37と半角英小文字に互換のあるCCSID 5035が作られました。さらに、ユーロ記号(英語の C の中に二本の横線を重ねたような通貨記号)を追加サポートする目的が出てきたため、5035のCCSIDにユーロ記号のほか【㈲】や【①】などの環境依存文字を追加した1399 が作られた、という経緯になります。」

渡邊:「日本語用のCCSIDにはそのような成り立ちがあったのですね。」

:「比較が分かりやすいように、以下の表を用意しました。これは、16進コード・ポイント【81】に割り振られている文字をCCSIDごとに比較したものになります。」

CCSID 16進コード・ポイント【81】に割り当てられた文字
37(英語) a
5026
5035 a

:「CCSID 37と5035は同じ【a】になりますが、5026だと半角カナの【ア】になりますね。この差が、文字化けを起こす原因となるわけです。
今回はわかりやすく1つの文字を例として挙げましたが、CCSID 5026と5035の16進コード・ポイントの違いについては、外部サイトですがこちらが参考になるかと思います。」

渡邊:「なるほど、私が使用している環境で5035を採用しているのには、そういった意味があったんですね。」

松田:「さて、CCSIDは、IBM i のシステム全体としての設定であるシステム値と、ユーザー・プロファイルとしての設定、ジョブを通じて切り替えることができるんですよ。」

渡邊:「システム値は具体的にどのように確認するのですか?」

:「システム全体におけるCCSIDは、システム値QCCSIDの設定値が影響します。コマンドで確認できますよ。【DSPSYSVAL SYSVAL(QCCSID)】を入力し実行してください。」

渡邊:「入力して実行しました。『5035』であることが分かりますね。ちなみに5035の横に範囲がありますが、最大値は『65535』なのですね。」

:「良い点に気が付きましたね。実はメーカー出荷時は65535です。65535は無定義(言語などを特定しない)という意味になります。日本語環境のお客様では、デフォルトである65535のまま運用しているユーザーが多いかと思います。」

渡邊:「え、でも最初の説明では、5026のユーザーが多いと言われていたかと...。」

:「はい、これにはちょっとしたからくりがあります。これは、一つのルールだと思ってほしいのですが、システム値QCCSIDに65535(無変換)を指定している場合、個別で指定していない限り、ジョブのCCSIDは65535になりますが、65535の場合、そのジョブの言語IDにより適切なCCSIDが自動的に設定されます。ジョブの言語IDは通常はシステム値『QLANGID』を参照しますが、日本語環境の場合『JPN』になっています。『JPN』の場合CCSIDは 5026を使用すると決まっているのです。」

渡邊:「そんなルールがあるのですね。そうなると、ジョブのCCSIDはどのように決まるのでしょうか。」

:「ジョブのCCSIDについては、まずジョブが使用しているユーザー・プロファイルの設定情報からとられます。という事で、ユーザー・プロファイルの設定を見てみましょう。
コマンド【WRKUSRPRF USRPRF(ユーザー名)】にてご自身のプロファイルを見てみてください。」

渡邊:「実行しました。ここで自分のユーザー・プロファイルに『5=表示』ですね。」

:「そうなのですが、今表示されている画面で『F21=援助レベルの選択』を押していただき、援助レベルを『2=中間』にしてください。『1=基本』になっている場合、CCSIDの値が確認できないので。」

渡邊:「わかりました。『2=中間』になっていることを確認しましたので『5=表示』を入力、実行しました。ページダウンをしていくと・・・ありました。『コード化文字セットID』ですね。値は『*SYSVAL』になっています。」

:「はい、ご確認ありがとうございます。『*SYSVAL』というのは、この値がシステム値に指定されたQCCSIDと同じ値であることを意味しています。」

松田:「いわば『*SYSVAL』の表現は、具体的な設定値を省略していると捉えればいいですね!」

:「はい。渡邊さんがお使いの環境では、QCCSIDの値は5035 という事でしたので、そのユーザー・プロファイルもCCSIDは 5035 を使用する、という事になりますね。
ちなみに設定を変更したい場合はコマンド【CHGUSRPRF】を実行し、ユーザー名を指定することで変更できます。プロンプト画面で『F10=追加のパラメーター』を押し、ページダウンし、『コード化文字セットID』で変更できますよ。」

CHGUSRPRF実行後、『F10=追加のパラメーター』を押してページダウンした様子

渡邊:「なるほど。理解できました。」

:「次に確認したいのがジョブのCCSIDです。渡邊さん、【WRKJOB】を実行し、『2.ジョブ定義属性表示』を選択してみてください。」

渡邊:「はい、実行してみました。ページダウンしていくと・・・『コード化文字セットID』が見つかりました。5035になっていますね。その下に『省略時のコード化文字セットID』という値もありますね。」

:「はい、『省略時のコード化文字セットID』は、『コード化文字セットID』が65535の場合に、言語IDから自動的にCCSIDが割り振られるんです。例えば65535のユーザーの場合はどのようになるかというと・・・」

渡邊:「おお、『省略時のコード化文字セットID』が5026になっています。」

:「はい。言語IDがJPN(日本)なので、5026 が設定されたんですね。ちなみにこれは参考までにですが、英語環境のジョブだとこのようになります。」

松田:「65535の場合は言語IDによってCCSIDが自動選択されることがよくわかりました。」

:「ちなみに今渡邊さんのジョブは5035かと思いますが、例えばジョブのCCSIDを5026に変更する時は、【CHGJOB CCSID(5026)】と入力すれば、実行中のジョブのCCSIDを変更できますよ。」

渡邊:「そういえば、先輩がWeb-APIの案件で、ILE RPGプログラム実行するためのCLプログラムの中で、ジョブのCCSIDを変えてからプログラム実行していました。」

:「まさに、そのような使い方で利用しますね。ジョブの中でSQLやSHELLコマンドを実行したいなど、CCSIDを切り替えたい場合に行ったりします。CHGJOBは、ジョブ単位で有効なコマンドですのでジョブが終了すればリセットされます。
CCSIDがどういったものなのかが少しでもわかると、ちょっとだけ世界が広がるような気がしますね。」

ホスト・コード・ページ

松田:「ちなみに、渡邊さんはCCSID 5035の環境を使っていますが、エミュレーター画面を開くとメニューが文字化けしませんか?」

渡邊:「はい。【CTRL】+【F3】で文字化けが直ると聞いていましたが、理由は知りませんでした。サインオン直後の画面は以下のようになり、画面下部のファンクションキーの説明が文字化けています。」

渡邊:「【CTRL】+【F3】を押すと以下のように直ります。」

松田:「実は、5250のメニュー画面はCCSID 5026を想定して作られています。5035環境は英小文字用の環境なので半角カナが文字化けを起こしているんです。」

渡邊:「なるほど、そういう背景があったのですね。」

:「【CTRL】+【F3】の表示切替にはホスト・コード・ページが関わっています。次はホスト・コード・ページのお話をしましょう。」

渡邊:「よろしくお願いします!」

:「ホスト・コード・ページは、サーバーが送受信する EBCDIC 文字コードにあわせて、端末側の文字コードである Shift-JISとの間のコード変換を正しく行えるようにするための設定値です。ACSでいうと、エミュレーター上部のメニュー『通信』から『構成』を選択して、『接続』メニューを選択すると、下の画像のように様々な国のコードが選べる仕組みになっています。サインオン中に変更しようとすると、エミュレーターの再起動が必要になるので、注意してくださいね!」

:「ちなみに、日本語環境で使用するものとしては、ACSでは以下のものがありますね。」

  • 930 日本語(カタカナ)
  • 930 日本(拡張カタカナ)
  • 939 日本(拡張ローマ字)
  • 1399 日本語(Latin Unicode 拡張)
  • 1399 日本語(Latin Unicode 拡張; JIS2004)

渡邊:「結構種類があるんですね。」

:「はい。いくつか種類がありますが、実はどれを使ってもいいというわけではなく、お使いのCCSID(QCCSIDまたはジョブのCCSID)に合わせた組み合わせで使用する必要があります。
そうでないと、エミュレーターから入力した文字が文字化けを起こすことになります。細かい説明は置いておいて、正しい組み合わせは以下になると覚えておいてください。」

CCSID ホスト・コード・ページ
65535(5026) 930
5035 939
1399 1399

渡邊:「そうなんですね、覚えておきます!」

:「ちなみに今回渡邊さんがお使いの環境では、CCSID 5035になりますので、正しい組み合わせとなるホスト・コード・ページは『939 日本(拡張ローマ字)』になります。念のため設定を確認してみましょう。」

渡邊:「はい、確認したところ『939 日本(拡張ローマ字)』になっていますね。」

:「CCSIDのセクションで、多くのお客様が CCSID 65535(5026)をお使いとお伝えしたかと思います。ACSですと、デフォルトのホスト・コード・ページが『939 日本(拡張ローマ字)』になるためCCSID 5026 では文字化けを引き起こす可能性があります。
特に過去のエミュレーターIBM i Access for Windowsや別製品のエミュレーターIBM Personal Communicationsでは、ホスト・コード・ページのデフォルトは『930』でしたので、その感覚でACSのセッションを設定してしまうと問題が起こります。」

渡邊:「そうなんですね、それは注意が必要ですね。ところで、ホスト・コード・ページ930は2種類ありますね。これはどういったときに使い分けるのでしょうか。」

:「「『930 日本語(カタカナ)』はあくまで半角カナを使用したい場合になりますが、このホスト・コード・ページですと半角英小文字の入力はできません。CCSIDが5026の環境で、半角カナを使用しつつ半角 英小文字も使用したい場合、『930 日本(拡張カタカナ)』を使用するのが正しいのです。」

渡邊:「そうなのですね、わかりました。ところで、1399は環境依存文字を使用するホスト・コード・ページのようですが、930のコードで環境依存文字の入力ができるホスト・コード・ページというものはないのでしょうか。そういえば CCSID でも 環境依存文字が使用できるのは 1399 しかないですよね。加えて、1399も2つのホスト・コード・ページが存在しているようですね。」

:「はい、【㈲】や【①】などの環境依存文字を使用したい場合は、CCSID でも ホスト・コード・ページでも 1399 しかありません。1399にのホスト・コード・ページが2種類存在する点について、『1399 日本語(Latin Unicode 拡張)』は過去のシステムや古いOS(Windows XP以前)で作成されたデータと連携するなど過去の文字環境との厳密な互換性を維持したい場合に使用します。一方、『1399 日本語(Latin Unicode 拡張; JIS2004)』は2004年に改訂された新しいJIS規格に準拠していて、現在のWindows(Vista以降〜Windows 10/11など)の標準仕様に合わせて文字を扱いたい場合に選択します。よって、特別な事情がない限りは『1399 日本語(Latin Unicode 拡張; JIS2004)』の使用でいいかと思います。
65535(5026)環境で環境依存文字を使用する場合も、データベース含め、1399の環境を用意する、というのが本来の正しい使い方になります。データベース単位で正しく管理できればそのような使い方でも問題はないものと思います。」

PCとIBM i 間でのデータ受け渡し時の文字コード

:「IBM i は、WindowsなどのPCとは基本構造から異なります。その中でも大きな要素の1つであるのが文字コード規格です。例えば、WindowsであればSJISなどでCSVを扱います。さらにASCIIやUTF-8もあります。一方でIBM i はEBCDICという文字コードなので文字コードの体系が全く異なります。つまり、PCからIBM i へデータ転送しようとする際には変換が必要になります。詳細は、こちらの記事をご覧ください。」

渡邊:「やはりデータ転送の度に変換作業が発生しますよね。変換はどのようにするのですか?」

:「データの受け渡し方法としては大きく3つあると考えてよいかと思います。」

  • エミュレーターを使用したデータ転送
  • FTPを使用したデータの送受信
  • 統合ファイル・システム(IFS)を利用したデータ連携

:「1つ目のエミュレーターを使用したデータ転送であれば、ファイル形式や文字コードの指定ができますので、比較的簡単に設定ができるものと思います。」

松田:「確かにそうですね。またACSのデータ転送機能がありますが、この機能を使えば、ツールが自動的にコード変換してくれるのでExcelのデータをIBM i にアップロードするなども簡単です!データ転送の詳細はこの記事でも紹介していますよ。」

渡邊:「普段何気なく使っているACSですが、異なる文字コードの橋渡しをしてくれるなど便利な機能が多いですよね!」

:「そうですね。松田さんがおっしゃったExcel(xlsx形式)のデータのアップロードやダウンロードについては、以前のエミュレーターではできませんでしたので、非常に便利になってきていると思います。」

:「2つ目は、FTPを使用したデータの送受信です。FTPサブコマンドで文字コードを指定することができるので、EBCDICで構成される物理ファイルも、SJISに変換してダウンロードなども可能です。これはWindows PCからコマンドプロンプトを使用してFTPによるデータダウンロードの例になります。」

 FTPによるデータダウンロードの例(XXX.XXX.XXX.XXXはIBM i のIPアドレス)  --------------------------
C:\Users\USER123>FTP XXX.XXX.XXX.XXX
XXX.XXX.XXX.XXX に接続しました。
220-QTCP AT AS400.
220 CONNECTION WILL CLOSE IF IDLE MORE THAN 50 MINUTES.
501 OPTS UNSUCCESSFUL; SPECIFIED SUBCOMMAND NOT RECOGNIZED.
ユーザー (XXX.XXX.XXX.XXX:(none)): USER
331 ENTER PASSWORD.
パスワード:
230 USER LOGGED ON.
ftp> QUOTE TYPE C 943
200 REPRESENTATION TYPE IS CCSID 943.
ftp> GET YTEMP/TESTPF TESTPF943.TXT
200 PORT SUBCOMMAND REQUEST SUCCESSFUL.
150 RETRIEVING MEMBER TESTPF IN FILE TESTPF IN LIBRARY YTEMP.
226 FILE TRANSFER COMPLETED SUCCESSFULLY.
ftp: 92 バイトが受信されました 0.03秒 3.29KB/秒。
ftp>
--------------------------

渡邊:「『QUOTE TYPE C 943』の部分で、データ変換をしているのですね。」

:「はい、SJISにしたい場合は943を指定しますが、1208を指定することでUTF-8への変換も可能なんですよ。ちなみに、943 や 1208 も CCSID の一つです。」

渡邊:「UTF-8への変換も可能なんですね。便利です。【 GET YTEMP/TESTPF TESTPF943.TXT】でYTEMPライブラリーのTESTPFという物理ファイルをTESTPF943.TXTとしてダウンロードしているという理解で良いですか?」

:「その通りです!3つ目は統合ファイル・システム(IFS)を利用したデータ連携です。」

渡邊:「統合ファイル・システム(IFS)とは・・・?」

:「ここでは詳細な説明はしませんが、統合ファイル・システム(IFS: Integrated File System)とはIBM i の中に、Windowsと同じ階層構造のエリアが存在しており、Windowsと互換性があるんです。このエリアを使用してデータの受け渡しが可能になります。」

渡邊:「そうなのですね。具体的にどのように受け渡しをするのでしょうか。」

:「IBM i の中で変換をかけ、IFSエリアにファイルを作成する流れになります。例えば、CCSID 5026の物理ファイルを元に、SJISのCSVファイルを作成することができます。例として、このようなものを用意しました。」

 ポイント 
  • 物理ファイル:TESTY/ HINMSP
  • IFSに作成するCSVファイル:/YANAGI/HINMSP.CSV
  • コマンド例:
    CPYTOIMPF FROMFILE(TESTY/HINMSP) TOSTMF('/YANAGI/HINMSP.CSV') STMFCCSID(943) RCDDLM(*CRLF) RMVBLANK(*TRAILING)

:「CCSID 943を指定することで、このファイルをSJISに変換することができます。このファイルはSJISのCSVファイルとしてIFSエリアに作成されました。変換元の物理ファイルと、変換先のCSVファイルを見てみましょう。」

変換元の物理ファイル:
IFSエリアに作成されたCSVファイル:

渡邊:「おお、物理ファイルのデータがそのままCSVファイルに変換されているのが分かりますね。」

:「後は、FTPでCSVを取得したり、IFSのフォルダをファイル共用設定することで、ネットワークドライブのようにデータを取得することも可能になります。このあたりの説明は、また別の機会に...。
逆に外部から入手したCSVファイルを物理ファイルにコピーすることも可能です。その際はコマンド【CPYFRMIMPF】を使用することになります。」

松田:「そうですね。ただし、データ変換を正しく実行させるためには、ファイルのCCSID に対して正しいデータが含まれていることが前提となります。CCSIDとホスト・コード・ページの組み合わせは非常に大事ですので気を付けていきたいですね。」

次回予告

:「今回は、文字コードを中心にCCSIDやホスト・コード・ページなどをご紹介しました。渡邊さん、改めていかがでしたか?」

渡邊:「IBM i の文字コードは特殊であるというイメージを持っていましたが、その背景にはやはり元々汎用機との互換性や基幹業務環境における資産継承性を重視した結果であると知りました。IBM i の歴史やメーカーの対応力の柔軟性が文字コードからも垣間見えますよね。また、文字コード自体はWindowsでも同じ概念があるので、理解がしやすかったです。開発を行ううえでは、作成したコードが文字化けで見えないとなってしまうと業務影響が出てしまう部分なのでコード作成時から意識しておく必要がありますね。」

松田:「そうですね。最近ではIBM Bob(e-BELLNET.com内のIBM Bob特集)の登場により、エミュレーター画面以外でコーディングする機会が増えてきていますので、気を付けていきたいですね。今回はCCSIDのお話を中心に説明しましたが、IBM i には文字コードを考えるうえでシステム値という要素もあります、次回はシステム値について学んでゆきましょう。」

渡邊:「はい!開発していてモヤモヤしていた点が解消されてきて、スッキリしてきています。次回もよろしくお願いします。」

【豆知識】言語コードとCCSIDの関係性について

次回に続く


渡邊 隆
ベル・データ株式会社 アプリケーションマネージメントサービス本部 AMSデジタルイノベーション部


ネットワーク、オープン、セキュリティ、DX関連のプリセールス、構築、サポートを経て、現在はAMSデジタルイノベーション部に所属。工場DXソリューションを担当しながら、初挑戦のIBM i に格闘中。休日は、クラッシックピアノの練習や仲間との弾き合い会を楽しんでいます。








松田 三奈
ベル・データ株式会社 アプリケーションマネージメントサービス本部 AMSデジタルイノベーション部

新卒よりインフラエンジニアとしてPowerサーバーのリプレイスに従事し、現在はAMSデジタルイノベーション部に所属。休日は、カフェ巡りや旅行など天候に関わらず外に出てアクティブに活動することが好きです。

柳 真理絵
ベル・データ株式会社 Power事業部 カスタマーサクセス統括部 第1インフラストラクチャー・サービス POWER Tech Support


インフラエンジニアとしてPowerのリプレイスやバージョンアップなどを担当、現在は技術相談窓口「安心パック for i 」のメンバーとして日々お客様からの質問対応を行っている。休日は家族で出かけたり家でのんびりして過ごしています。

あわせて読みたい記事

PAGE TOP