CCSIDの実験
「CCSIDの話」ではいくつかの実験を行ってきましたが、普段AS/400を使用していて、更に疑問が深まり今回の実験を行うに至りました。
ソースファイルのCCSID、コンパイル時のCCSID、実行時のCCSIDの各組み合わせを以下の3パターンの実験を行いました。
1)PGM内のカナ・英小文字のリテラルをローカルデータエリアへ出力。
2)PGM内のカナ・英小文字のリテラルを5026のPF、5035のPFへ出力。
3)画面ファイルからカナ・英小文字を入力して5026のPF、5035のPFへ出力。
【実験1)PGM内のカナ・英小文字のリテラルをローカルデータエリアへ出力】
このサンプルソースをそれぞれ5026と5035のCCSIDのソースファイルへ作成しました。
以下が各組み合わせを実行した結果です。
*1)5026の場合はエミュレータのコードページは930カナ拡張、5035の場合は939英小文字拡張を指定しています。
この結果としては、
ソースのCCSIDは関係なくコンパイル時のCCSIDに依存した文字コードで出力されるということです。
また、上の表では記述していませんが、カナ・英小文字共に同じ結果でした。
CCSIDが混在すような1台のAS/400では、コンパイルのJOBのCCSIDが間違っていた場合に大変なことが発生することが推測できます。
【実験2)PGM内のカナ・英小文字のリテラルを5026のPF、5035のPFへ出力】
ここではこのサンプルソースをそれぞれ5026と5035のCCSIDのソースファイルへ作成しました。
以下が各組み合わせを実行した結果です。
怖い結果になりました。
ファイル記述に持っているCCSID属性と異なる文字コードで出力されています。エミュレータでctrl+F3を押したりして見た目上正しく見えていても内部的に異なったコードで入ってしまいます。
この結果では、PGMは実行されるJOBのCCSIDと同じCCSIDのJOB環境でコンパイルが必要という事が言えそうです。
実験1と同様にソースファイルのCCSIDは関係ないようです。
【実験3)画面ファイルからカナ・英小文字を入力して5026のPF、5035のPFへ出力】
今まではPGM内リテラルでしたが、今度は画面ファイルよりカナ・英小文字を入力した結果を見てみましょう。
このサンプルソースをそれぞれ5026と5035のCCSIDのソースファイルへ作成しました。
以下が各組み合わせを実行した結果です。
実験2と同じ結果となりました。画面経由で入力しても結果は同じ言うことのようです。
また画面ファイルのコンパイルをそれぞれ5026と5035でも行いましたが結果は一緒でした。
ソースファイルのCCSID、コンパイル時のCCSID、実行時のCCSIDの各組み合わせを以下の3パターンの実験を行いました。
1)PGM内のカナ・英小文字のリテラルをローカルデータエリアへ出力。
2)PGM内のカナ・英小文字のリテラルを5026のPF、5035のPFへ出力。
3)画面ファイルからカナ・英小文字を入力して5026のPF、5035のPFへ出力。
【実験1)PGM内のカナ・英小文字のリテラルをローカルデータエリアへ出力】
このサンプルソースをそれぞれ5026と5035のCCSIDのソースファイルへ作成しました。
以下が各組み合わせを実行した結果です。
| 実行環境(JOB CCSID) *1 | ||
| 5026 | 5035 | |
| 5026のソース・5026のJOBでコンパイル | 5026の文字コードで出力 | 5026の文字コードで出力 |
| 5026のソース・5035のJOBでコンパイル | 5035の文字コードで出力 | 5035の文字コードで出力 |
| 5035のソース・5026のJOBでコンパイル | 5026の文字コードで出力 | 5026の文字コードで出力 |
| 5035のソース・5035のJOBでコンパイル | 5035の文字コードで出力 | 5035の文字コードで出力 |
この結果としては、
ソースのCCSIDは関係なくコンパイル時のCCSIDに依存した文字コードで出力されるということです。
また、上の表では記述していませんが、カナ・英小文字共に同じ結果でした。
CCSIDが混在すような1台のAS/400では、コンパイルのJOBのCCSIDが間違っていた場合に大変なことが発生することが推測できます。
【実験2)PGM内のカナ・英小文字のリテラルを5026のPF、5035のPFへ出力】
ここではこのサンプルソースをそれぞれ5026と5035のCCSIDのソースファイルへ作成しました。
以下が各組み合わせを実行した結果です。
| 実行JOB CCSID=5026 | 実行JOB CCSID=5035 | |||
| 5026DBの結果 | 5035DBの結果 | 5026DBの結果 | 5035DBの結果 | |
| (1)5026のソース・5026のJOBでコンパイル | 5026の文字コードで出力 | 5035の文字コードで出力 | 文字バケ | 5026の文字コードで出力 |
| (2)5026のソース・5035のJOBでコンパイル | 5035の文字コードで出力 | 文字バケ | 5026の文字コードで出力 | 5035の文字コードで出力 |
| (3)5035のソース・5026のJOBでコンパイル | 5026の文字コードで出力 | 5035の文字コードで出力 | 文字バケ | 5026の文字コードで出力 |
| (4)5035のソース・5035のJOBでコンパイル | 5035の文字コードで出力 | 文字バケ | 5026の文字コードで出力 | 5035の文字コードで出力 |
ファイル記述に持っているCCSID属性と異なる文字コードで出力されています。エミュレータでctrl+F3を押したりして見た目上正しく見えていても内部的に異なったコードで入ってしまいます。
この結果では、PGMは実行されるJOBのCCSIDと同じCCSIDのJOB環境でコンパイルが必要という事が言えそうです。
実験1と同様にソースファイルのCCSIDは関係ないようです。
【実験3)画面ファイルからカナ・英小文字を入力して5026のPF、5035のPFへ出力】
今まではPGM内リテラルでしたが、今度は画面ファイルよりカナ・英小文字を入力した結果を見てみましょう。
このサンプルソースをそれぞれ5026と5035のCCSIDのソースファイルへ作成しました。
以下が各組み合わせを実行した結果です。
| 実行JOB CCSID=5026 | 実行JOB CCSID=5035 | |||
| 5026DBの結果 | 5035DBの結果 | 5026DBの結果 | 5035DBの結果 | |
| (1)5026のソース・5026のJOBでコンパイル | 5026の文字コードで出力 | 5035の文字コードで出力 | 文字バケ | 5026の文字コードで出力 |
| (2)5026のソース・5035のJOBでコンパイル | 5035の文字コードで出力 | 文字バケ | 5026の文字コードで出力 | 5035の文字コードで出力 |
| (3)5035のソース・5026のJOBでコンパイル | 5026の文字コードで出力 | 5035の文字コードで出力 | 文字バケ | 5026の文字コードで出力 |
| (4)5035のソース・5035のJOBでコンパイル | 5035の文字コードで出力 | 文字バケ | 5026の文字コードで出力 | 5035の文字コードで出力 |
また画面ファイルのコンパイルをそれぞれ5026と5035でも行いましたが結果は一緒でした。