z/OS利用時の文字コード変換 - 動作検証(1) 各ツールでの文字列表示

# はじめに
最近では、z/OS環境を使用する場合でもPCOM以外のUIを使った開発支援機能が提供されていたり、VS CodeやGitなどオープン系でも使われる技術を利用できるようになってきています。
そのような新しい技術を取り入れる場合、z/OS - オープン系の間の差異を意識しなければならない場面が多々出てきます。その中でも特に考慮が必要なのが**文字コード**です。
通常z/OS上では文字はEBCDICで扱われますが、オープン系の世界ではUTF-8(あるいはSJIS)で扱われることが多いです。つまりこれらの間でデータをやり取りする場合は**文字コード変換**が発生することになります。
英語圏の場合は問題になることは少ないかもしれませんが、日本語環境の場合色々と考慮しなければいけないことが出てきます。このシリーズでは、新しい仕組みを使ってz/OSを使っていくにあたり文字コード関連で気になる所の動作検証結果を整理していきたいと思います。基本的にはz/OS上でEBCDIC、それ以外の環境ではUTF-8でファイルを扱うことを想定します。

最初は各ツールでの文字列表示について見ていきます。

## 関連記事

[z/OS利用時の文字コード変換 - 動作検証(1) 各ツールでの文字列表示](https://qiita.com/tomotagwork/items/3960cd4d8c16a0092670)
[z/OS利用時の文字コード変換 - 動作検証(2) Git利用時のコード変換](https://qiita.com/tomotagwork/items/83896dcf83239cc2e4af)
[z/OS利用時の文字コード変換 - 動作検証(3) DBBユーザー・ビルド時のコード変換](https://qiita.com/tomotagwork/items/15e848ca296ece336f18)
[z/OS利用時の文字コード変換 - 動作検証(4) カタカナ系文字コードにおけるPDSメンバー名](https://qiita.com/tomotagwork/items/183b4109ec1f9ae49de4)


# 環境情報

z/OS V2.4
Windows11
PCOM V14
IDz V15.0.5
VS Code V1.77.3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/514e7a6e-2a62-f641-d20e-f21a2d3c2cf9.png)



# 動作検証

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/673cb275-a357-bed9-bf87-cb3febb5edae.png)

今回はz/OS上のPDSメンバーに含まれる各種文字列が、使用するツールごとによってどのように表示されるかを見ていきます。
具体的には、各種文字列を含むCOBOLのソースを各ツールを使って参照した時にどのように見えるか確認していきます。ここでは、基本的にz/OS側文字コードはIBM-1399を想定します。

## 主な検証対象文字列
コード変換において問題になりそうな文字をいくつかピックアップしてみます。
(SJISをかまさずにEBCDIC⇔UTF-8間の変換をしている限りにおいては、問題になる文字は少ないと思いますが...)

第1～4水準
|文字 | UTF-8	| IBM-1399	| 補足 |
|-----|-------|-----------|------|
|あい | 	E381E2 E381E4 | 4481 4482 |平仮名
|亜偉 | E4BA9C E58189 | 4867 4DFB |第一水準漢字
|弌仄 | E5BC8C E4BB84 | 5641 565A |第二水準漢字
|圡𡈽 | E59CA1 F0A188BD | B3B2 B3B1 |第三水準漢字※2つめの文字はサロゲートペア |
|冼𠗖 | E586BC F0A09796 |B981 B370 |第四水準漢字※2つめの文字はサロゲートペア |



新JIS/旧JISでコードポイントが入れ替わっている文字
|文字 | UTF-8	| IBM-1399	| 補足 |
|-----|-------|-----------|------|
|鯵鰺 | E9AFB5 E9B0BA | 	67AA 51F0 |
|壷壺 | E5A3B7 E5A3BA |	589B 5077 |

ベンダー選定文字
|文字 | UTF-8	| IBM-1399	| 補足 |
|-----|-------|-----------|------|
|ⅠⅡ |E285A0 E285A1	| 41F1 41F2 |
|ⅰⅱ |E285B0 E285B1	| 41B1 41B2 |
|①②	 |E291A0 E291A1	| E270 E271 |
|㈱℡ |E388B1 E284A1	| 446D 446F |
|∠	 |E288A0 | 434B |
|≒	 |E28992 | 435C |
|∵	 |E288B5 | 4478 |

半角記号
|文字 | UTF-8	| IBM-1399	| IBM-1390 | 補足 |
|-----|-------|-----------|------|------|
|`~`|7E|A1|A0|チルダ|
|`‾`|E280BE|A0|A1|オーバーライン|
|`\`|5C|E0|B2|バックスラッシュ|
|`¥`|C2A5|B2|5B|円|
|`$`|24|5B|E0|ドル|
|`^`|5E|B0|B0|キャレット|
|`¬`|C2AC|5F|5F|Notシンボル|

半角英字/カタカナ
|文字 | UTF-8	| IBM-1399	| IBM-1390 | 補足 |
|-----|-------|-----------|------|------|
|AB|41 42|C1 C2|C1 C2|半角英大文字|
|ab|61 62|81 82|62 63|半角英小文字|
|ｱｲ|EFBDB1 EFBDB2|59 62|81 82|半角カタカナ|



<details><summary><font color="blue">参考:SBCSコードポイント表/CCSID 939/1399(英小文字系)</font></summary><div>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cb14a169-7de6-c539-d46a-0c6fa0d697f3.png)

</div></details>


<details><summary><font color="blue">参考:SBCSコードポイント表/CCSID 930/1390(カタカナ系)</font></summary><div>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d8b3256d-ef58-c3be-b0b2-e7766b20880e.png)

</div></details>



### (1)PCOM

#### 設定
ホスト・コード・ページで `1399 日本語英数小文字拡張(JIS2004)`を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d71ed912-7aa8-1856-1742-e8a4642bd268.png)


#### 表示
3.4でPDSメンバー表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/24ec328d-f4de-8a9d-612a-657c3c5680ad.png)


`HEX ON`の表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0293a718-d39c-bb70-9981-3f74e193b065.png)

特に問題なく表示できています。

### (2)VS Code

#### 設定
z/OSMF接続のプロファイルで`"encoding": "IBM-1399"`を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0332c31b-d319-89f2-7f84-9f83aa2f88b7.png)

#### 表示
Zowe ExplorerでPDSメンバー表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/072d5132-4c0a-6517-eb10-403dea102408.png)

特に問題なく表示できています。

Hex表示で見てみます ([Hex Editor](https://marketplace.visualstudio.com/items?itemName=ms-vscode.hexeditor)を使用)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/278662d2-484b-408c-8126-46af7bb42dcb.png)

VS Codeでは一旦ローカルにコード変換(EBCDIC⇒UTF-8)したファイルを保存してそれを編集することになります。そのため、その一時ファイルをHex Editorで見るとUTF-8のコードになっています。

### (3)IDz

2023年4月時点ではIDzの最新版であるV16.0.0はコードページIBM-1390/IBM-1399がサポートされていませんでした。そのためここではIDz V15を使用して検証しています。
参考: [APAR:PH53829](https://www.ibm.com/support/pages/apar/PH53829)
⇒ 2023/06/12 にFixが提供され、APARはCloseされました。
この修正はz/OS Explorerの3.3.2に含まれて提供されます。
https://www.ibm.com/support/pages/node/713167
この修正はIDz16.0.2クライアントにも含まれます(IDz16.0.2にはz/OS Exlorer3.3.2が含まれています)。
ただし、この修正はMVSデータセットに関する指定に関する修正のみで、z/OS Unix上のファイルについては2024年2月現在でもIBM-1390/IBM-1399がサポートされていません...

#### 設定
MVSファイルのプロパティーのホスト・コードページで`IBM-1399`、ローカル・コード・ページで`UTF-8`を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b25ae855-a0d6-85eb-74b6-936fc117e840.png)

#### 表示
zSystems LPEXエディターで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4d038895-4bde-a5a8-6bf8-71a46296e523.png)

一部第三水準の文字が化けてます...

HEXで見てみます。(LPEXエディターでAlt+Shift+H)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c9e98b5d-8c6e-4e43-7427-a97328531cad.png)

<font color="red">
※これは直接ホスト上のPDSメンバーを見ていることになっていますが、恐らくVS Codeと同様に内部的には一旦PC上に持ってきてUTF-8に変換してエディターで表示させているのではないかと思われ、LPEXエディターのHEX表示機能は、UTF-8をベースに他のコードに変換した場合のコードを表示しているものと思われます。文字列表示や他コードページのHEX表示について、UTF-8のサロゲートペアのハンドリングがうまくいっていないのではないかと推察されます。(要調査)
</font>

### (4)おまけ:teraterm(SSHクライアント)

#### 設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7be86af0-3dff-cadf-6b25-c7fe2de664d1.png)

※SSH接続の場合EBCDIC⇔ASCII変換をしてくれる。ただし日本語には対応していない。とりあえず文字コードとしてはASCIIなのでSJIS/UTF-8あたりを指定。


#### 表示
例えば、catコマンドで対象のPDSメンバーを表示させてみると想定通り文字化けします。
(一応やってみただけ)

```
TAGUCHI : /u/TAGUCHI : > cat "//'TAGUCHI.TEST01.COBOL.SOURCE(TSUB04)'"
       IDENTIFICATION DIVISION.
       PROGRAM-ID. TSUB04.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.

       LINKAGE SECTION.
       01 PARM04.
           COPY 'CPPARM$4'.

       PROCEDURE DIVISION USING PARM04.

           DISPLAY '--- BEGIN TSUB04'
           DISPLAY '濛瀉 酣ｨﾛ 釞｡ 﨧･ｷ｣ ｾ盥'
           ISPLAY 'ﾅ｡ｰ 鴈ｺｦﾏ'
           DISPLAY ' ｱ ｲ  ｣ ･ ﾓﾉ 濱ｿ 琅ｮ ｪ 萵ﾌ'
           DISPLAY 'AB ab ﾟﾂ'
           DISPLAY '~ ｵ \ ･ $ ｬ ^'
           MOVE "XXXXX" TO ITEM04-01.
           MOVE "YYYYY" TO ITEM04-02.

           DISPLAY '--- END TSUB04'

      *****************************************************
           GOBACK.
```