#if defined(W32) || defined(LNX)
.EBCDIC変換。
EBCDIC 変換ではICU/iconvなど外部のコンバータを使用することが出来ます。
CVコマンド(同梱のXCVコマンドは同等の機能の外部ツールです),xe3270FTPで使用できます。
変換定義ファイルを用意してください。以下はその説明です。
(EBCDICファイルの直接編集は"EBCDICファイルサポート"を参照)
****************************************************************************
このファイルは EBCDIC<->PC コードページ 変換パラメータを定義します。
xeのEBCDICファイルサポート,xe の CV 編集コマンド,xe3270 FTP, XCV ユーティリティーで使用します。
このファイルの場所は xe3270FTP では xe3270.cfg の CHARSET_CFG パラメータで、
ユーテリティのXCVコマンドでは /MF:mapfile パラメータで指定します。
xeのEBCDICファイルサポート,xe の CV 編集コマンドではini ファイルで指定します。省略値は ::xeebc.cfg
EBCDIC_cfg ="" #("::xeebc.map")# EBCDIC translation config filename
変換パターンが3種あります。
各々のパターンで必要なパラメータは異なり、不要な指定はあっても無視されます。
(a).内部テーブルを使用した日本語の変換。
XCV/CVコマンドは関連したオプションパラメータがありそちらが優先されます。
xe3270FTP では 必要なら このファイルの SJIS_OPTで指定してください。
有効なパラメータは SJIS_OPT,SOSI_A2E,SOSI_E2A です。
(b).外部(ICU)ないしはシステム(Windows NLS API, Linux iconv)コンバータを使用した変換。
ICUは uconv コマンドを、iconv は iconv コマンドを単独で使用することもできます。
xe3270FTPではこのファイルを使用して変換します。
XCV/CVコマンドからMAP_A2E/MAP_E2Aを指定したこのファイルを使用して、
uconv/iconvによる変換を補正することができます。
文字セットのリストは "uconv -l" (ICU) ないし "iconv -l" で得ることができます。
Windows コードページ, ICU のコードページは xcv -List で出ます。
(Windowがサポートするコードページには有効な DBCS EBCDIC コードページは含まれてないようです。
ICUの導入が必要です)
(c).指定されたマッピングをs3270+IND$FILE によるuploadの前(MAP_A2F)、downloadの後(MAP_F2A)に
適用しs3270による変換を補正します。
MAP_A2F/MAP_F2Aのみが有効なパラメータです。
3270FTPについて。
.DBCSユーザーの場合
IND$FILEはDBCSをサポートしていません。
(s3270 を --enable-DBCS オプションで make すると画面データは変換されます)
xe3270は FTP データを 外部/内部コンバータで変換しバイナリーモードで送信/受信します。
但し、それができるのは固定長データセット/MEMBER だけです。
可変長データセット/MEMBER は s3270によるSBCS変換に上記(c)の補正ができるだけです
更にxehosts で DBCS= オプションを指定する必要があります。
DBCS=CP939 か DBCS=939 を指定すると内部テーブルを使用します。上記のパターン(a)。
DBCS=OTHER を指定し このファイルの CONVERTER パラメータを 1 とすると、
外部/システム コンバータを使用します。上記のパターン(b)。
このファイルのパラメータは以下のタイミングで適用されます。
ホストへ送信。
[PCcode]->{mbrtowc/LOCAL_CHARSET}->[UCS2]->{DBCS_CHARSET/SBCS_CHARSET}->[EBCDIC]
===>(binary mode xfer)===>HOST
ホストから受信。
[PCcode]<-{wcrtomb/LOCAL_CHARSET}<-[UCS2]<-{DBCS_CHARSET/SBCS_CHARSET}<-[EBCDIC]
<===(binary mode xfer)<===HOST
MAP_A2E MAP_E2A SUBCHAR_xxx は SBCSの変換を補正するのに使用されます。
そこで定義されたコードポイントはコンバータを通さずにマッピングされます。
.SBCSユーザーの場合
s3280 は --charset オプションでいくつかの文字セットをサポートしています。
(サポートされてる文字セットは http://x3270.bgp.nu/s3270-man.html を参照)
この中に適当な文字セットがあればxe3270の変換機能は不要と思われます。
もしいくつかのコードポイントでそちらの環境に適合しない場合は
このファイルの MAP_F2A/MAP_A2F パラメータで補正してください。
この場合は CONVERTER パラメータは 0 を使用します。上記パターン(c)。
パラメータは以下のタイミングで適用されます。
ホストへ送信。
[PCcode]->{MAP_A2F}->[PCcode]->(s3270)->[PCcode]===>(IND$FILE)->[EBCDIC]
ホストから受信。
[PCcode]<-{MAP_F2A}<-[PCcode]<-(s3270)<===[PCcode]<-(IND$FILE)<-[EBCDIC]
固定長データセット/MEMBER に対しては外部/システムコンバータを使用することも出来ます。
その場合パラメータCONVERTERを 1 に設定し SBCS_CHARSET を指定します。
パラメータの適用タイミングはDBCS変換に準じますが、SBCS_CHARSETにDEFAULTMAPを
指定するとコンバーターを使用せず ISO-8859-1<-->CP037に準ずるs3270のテーブルと同じ
マッピングをします。いずれの場合もMAP_A2E/MAP_E2Aが適用されます。
固定長レコードについて。
x3270FTPの場合はDATASETのRECFMが固定長、XCVコマンドの場合は/F[xx][N]コマンドラインオプションを
指定した(CVコマンドには /F オプションはありません)、その場合PC->EBCDIC変換の時
長文は分割され短文はLRECLまでスペースパディングされます。
改行文字は出力されません。
/F[xx][N]のNオプションは行末8桁が行番号であることの指定です。
DBCS変換でSO/SIの挿入により伸びた行は行番号欄の前にスペースがあれば
そのスペースを削除してLRECLを保持しようとします。それが出来ない場合
行分割されますが N 指定があれば行番号欄は切り捨てられます
xe3270FTPの場合PROfileコマンドでDATASETのプロファイルをNUMSTDにすることで
行番号ファイルとなります。
(DATASETのメンバーを1つどれか /Mnオプションで開き "PRO path save"を入力)
EBCDIC->PC変換の場合、固定長ファイルはバイナリーモード(改行コード無視)で
読み込み変換され改行コードを付与して出力されます。
XCVコマンドの /Mseteol指定で PC<-->EBCDIC変換で改行コードを付与できます。
/mASCEOL: EBCDIC ファイルの行末コードが Windows:0x0d0a, Linux 0x0a。省略値:0x15。
/mSETEOL: 出力各行にEOL-IDを追加出力。x2B と レコードモード B2x用。
尚、固定長LRECL は /F オプションで指定します
/F[nn][N]:EBCDIC ファイルが固定長。nn:LRECL(省略値=80)。
B2x(入力) 又は x2B(出力) EBCDIC ファイルのLRECL。
N: 行末8桁が行番号欄。SO/SI挿入で行長を調整する。
"N" は m2b でのみ有効。
例。
xcv /cm2b ms932 ibm939.txt /mf:sjisebc.map /F80 /Mseteol /Masceol
(locale-->ebcdic, output LRECL=80, set ASCII-EOL-ID)
xcv /cm2b ms932 ibm939.txt /mf:sjisebc.map /Masceol /Mseteol
(locale-->ebcdic, output line with appened ASCII-EOL-ID)
xcv /cb2m ebcf1 ascf2 /mf:sjisebc.map /F80 /Mseteol
(locale<--ebcdic, input LRECL=80, output line with appened ASCII-EOL-ID)
xcv /cb2m ebcf1 ascf2 /mf:sjisebc.map /Masceol
(locale<--ebcdic, input line with ASCII-EOL-ID
cfg ファイルパラメータ。
#####################################################################################
## 各パラメータの説明 ##
CONVERTER : コンバーターの選択
0 : MAP_A2F/MAP_F2A パラメータにしたがって全SBCS変換する。
MAP_A2F, MAP_F2A 以外は無視される。
1 : ICU で変換(ICUの導入が必要)
2 : Linuxでは iconv API, Windowsでは WideCharToMultibyte/MultiByteToWideCharで変換。
1 と 2 では CHARSET_DBCS, CHARSET_DBCS (LOCAL_CHARSET) パラメータで変換され、
MAP_E2A と MAP_A2E がその補正のために使用されます。
MAP_A2F と MAP_F2A は無視されます。
例)
CONVERTER 1 # apply converter
ICU_DLL_SUFFIX : .dllないし.so ライブラリ名のサフィクス。
"CONVERTER 1" の時 必要。
但し省略値のライブラリーを調べる以下のロジックで問題がなければ指定不要です
Android版 : /system/lib
Linux版 : /usr/local/lib:/usr/lib:$(LD_LIBRARY_PATH)
Linux-64版 : /usr/local/lib64:/usr/lib64:$(LD_LIBRARY_PATH)
Windows版 : GetSystemDirectory();GetWindowsDirectory();$(PATH)
例えば GetSystemDirectory() : c:\Windows\system32
GetWindowsDirectory(): c:\Windows
例)
ICU_DLL_SUFFIX 44 # if dllname is icuuc40.dll
ICU_API_SUFFIX : ICU API 名のサフィックス。
"CONVERTER 1" の時 必要。
但し省略値のライブラリーを調べるロジックで問題がなければ指定不要です
例えば "ucnv_open" の実名は icuuc40.dll では ucnv_open_4_0 になっています。
例)
ICU_DLL_SUFFIX _44 # if dllname is icuuc40.dll
v44 の場合 SUFFIXは以下に定義されています
$(icu)/source/common/unicode/uvernum.h
#define U_ICU_VERSION_SHORT "44"
#define U_ICU_ENTRY_POINT_RENAME(x) x ## _44
ICU_DATA : 自分で .cnv ファイルを作成して省略値のフォルダー以外においた場合その場所を指定する
例)ICU_DATA=/system/usr/icu:/data/data/yourcnvs
yourcnvsにはicudt__lサブフォルダーを作成しその中にcnvファイルを置いてください
DBCS_CHARSET : UCS<-->EBCDIC 変換でDBCS をサポートする文字セットを指定する。
(文字セットのリストは "uconv -l" ないし "iconv -l" で得ることができます。)
この指定がない場合は全SBCS変換になります。
尚、xe3270FTP の場合 この指定を適用するにはxehosts で DBCS=OTHER の指定が必要です。
例)
DBCS_CHARSET cp939 #Japanese
DBCS_CHARSET cp933 #Korean Mixed EBCDIC
DBCS_CHARSET cp935 #Chinese(Simplified) Mixed EBCDIC
DBCS_CHARSET cp937 #Chinese(Traditional)Mixed EBCDIC
SBCS_CHARSET : UCS2<-->EBCDIC SBCS 変換文字セットを指定。
(文字セットのリストは "uconv -l" ないし "iconv -l" で得ることができます。)
DBCS_CHARSET 指定の文字セットがSBCS変換を含む場合は指定不要。
"DEFAULTMAP"を指定すると ibm37,swaplfnl の ISO8859-1<-->EBCDIC に相当する内部テーブルを使用。
ibm37,swaplfnlはs390標準でibm37と異なりEBCDIC-0x25<-->ASCII-0x85, EBCDIC-0x15<-->ASCII<-->0x0aです
例)
SBCS_CHARSET CP037 #use external converter
SBCS_CHARSET DEFAULTMAP #use internal map corresponding to ISO-8859-1 and CP037
Windows で CONVERTER=2 の場合
SBCS_CHARSET 1047 #EBCDIC latin
LOCAL_CHARSET : UCS2<-->PC コードページコンバーター名。
"SBCS_CHARSET DEFAULTMAP"の時は無視される。
指定のない場合は 環境変数などからコードページが決定される
Axeでは ICU が使用されます
例)
LOCAL_CHARSET ISO-8859-1 #
LOCAL_CHARSET CP932 #
Windows では Windows コードページ番号を指定する
LOCAL_CHARSET 932 #JP
MAP_E2A/MAP_A2E: SBCS変換の補正をコードポイントごとに指定します。
例えば, 0x7e は iso-8859-1 ではチルダで cp897 では上線です。
そして CP1027(EBCDIC) では 0xa0 は上線、0xa1 がチルダです。
s3270で CP1027 が使えない場合、"s3270 -charset CP290" とした上で
次のようなパラメータ設定が考えられます。
例)
MAP_E2A 0xa0: 0xaf # EBCDIC 0xa0 -> ASCII upper-bar
MAP_E2A 0xa1: ~ # EBCDIC 0xa1 -> ASCII tilde
MAP_A2E 0xaf: 0xa0 # EBCDIC 0xa0 <- ASCII upper-bar
MAP_A2E ~: 0xa1 # EBCDIC 0xa1 <- ASCII tilde
MAP_A2F/MAP_F2A: "CONVERTER 0" の時に使用されます。
s3270+IND$FILE の変換を補正します。
MAP_A2F は ホストへ送信前のファイルに適用、
MAP_F2A は ホストから受信後のファイルに適用されます。
例)
MAP_A2F 0xaf: ~ # upload 0xaf(upper bar) as 0x7e(tilde)
MAP_F2A 0x1f: . # convert downloaded 0x1f to printable char
SUCHAR_SBCS : 変換不能 SBCS 文字の代替文字。ユニコード値で指定。
省略値は U001a.
SUCHAR_DBCS : 変換不能 DBCS 文字の代替文字。ユニコード値で指定。
省略値は Ufffd.
ICU の 文字セット->ユニコード 変換の代替文字は 0x1a と 0xfffd です。
文字セット<-ユニコード 変換の代替文字は ICU ソースファイルの
各文字セットの xxx.ucm ファイルで定義されています。
xe は EBCDIC<->ユニコードとPC文字セット<->ユニコード変換でこれを受け入れます。
従って、SUBCHAR_SBCS と SUBCHAR_DBCS は次の場合に利用され、
変換不能なコードの代わりにこのユニコードを変換して出力します。
LOCAL_CHARSET指定のない場合(ICUではなくwcr2mb/mbrtowc APIを使用)
"CONVERTER 2" 指定の場合(システムコンバータを使用)。
例)
SUBCHAR_SBCS 0x003f # "?" for translation err
SUBCHAR_DBCS 0x30fb # EBCDIC 0x4345 in CP939
ICUでない場合は 省略値の Ufffd や U001a の変換も失敗する可能性もあります。
その場合は変換もとの値が出力されます。不都合がある場合は
SUBCHAR_xxxx を指定してください。
SUBCHAR_0a : PCコードページへの変換のとき 0x0a(改行コード)の出力を制御する。
1 : 0x0a を SBCS 代替文字(の変換)で置換する。
0 : 0x0a をそのまま出力する。(省略値)
SUBCHAR_S2D : PCコードページへ変換の時、EBCDIC SBCS->マルチバイト変換を許すか。
1 : SBCS 代替文字(の変換)で置換する。
0 : マルチバイト出力を許す。(省略値)
SJIS_OPT : SJIS 変換オプションを指定する。
パターン (a) で有効なパラメータ。(xehostsで DBCS=CP939 か CP930 を指定した場合)
XCV/CV コマンドでは同じ効果のコマンドラインパラメータがあり、
コマンドラインパラメータの指定が優先される。
IBM :EBCDIC 漢字を SJIS-IBM エリアにマッピング (省略値)
NEC :EBCDIC 漢字を SJIS-NEC エリアにマッピング
JIS78:SJIS 1978 版
JIS83:SJIS 1983 版 (省略値)
ENG_EXT :日本語英小文字拡張(CP939=CP1027)
KANA_EXT:日本語カタカナ拡張(CP930=CP290)
例)
SJIS_OPT NEC
SJIS_OPT JIS78
SJIS_OPT KANA_EXT
SOSI_A2E : DBCS を EBCDIC へ変換する時の SO/SI 設定オプション。
XCV/CV コマンドでは同じ効果のコマンドラインパラメータがあり、
コマンドラインパラメータの指定が優先される。
省略値は xe3270FTP では SHIFT, 以外では INS。
INS :SO(0xe), SI(0x0f) を 挿入。 出力は伸張します。
REP :DBCS文字列の前後がスペースがあればこれを置換、なければ挿入。
SHIFT:xe3270のみ、REPに加えて挿入による伸張分を後続のスペースの削除で吸収。
例)
SOSI_A2E REP
SOSI_E2A : DBCS を EBCDIC から変換する時の SO/SI の取り扱い。
XCV/CV/SAVe/REPlace/COPy/... コマンドでは同じ効果のコマンドラインパラメータがあり、
コマンドラインパラメータの指定が優先される。
DEL :SO/SI を削除。出力行長が短縮になります。
REP :SO/SI を ASCII スペースで置換(省略値)。
## サンプルファイル ##
xeebc.map ~
##########################################################
# CONVERTER 1 # 0:s3270 translation, 1:ICU, 2:iconv/WindowsAPI||+v124R
# ICU_DLL_SUFFIX 44 # ICU dllname suffix
# ICU_API_SUFFIX _44 # ICU apiname suffix
# DBCS_CHARSET cp939 #(Linux)EBCDIC Japanese English lower-case letter extension.~||+v124R
# DBCS_CHARSET nnnn #(Windows)No corresponding Windows Codepage||+v124I
# SBCS_CHARSET cp037 #(Linux)EBCDIC-US ||+v124R
# SBCS_CHARSET 37 #(Windows)ECDIC-US ||+v124I
# SBCS_CHARSET cp939
# SBCS_CHARSET CP037 #Linux
# SBCS_CHARSET 37 #Windows Codepage for CP037(EBCDIC US)
# LOCAL_CHARSET ISO-8859-1 #(Linux)Latin-1 ||+v124R
# LOCAL_CHARSET 28591 #(Windows Codepage) for ISO-8859-1||+v124R
#
# MAP_A2F 0xaf: ~ # upload 0xaf(upper bar) as 0x7e(tilde)
# MAP_A2F 0x30: 0x31 # upload 0xaf(upper bar) as 0x7e(tilde)
# MAP_A2F 0x31: 0x30 # upload 0xaf(upper bar) as 0x7e(tilde)
# MAP_F2A 0x1f: . # convert downloaded 0x1f to printable char
# MAP_F2A 0x31: 0x30 # upload 0xaf(upper bar) as 0x7e(tilde)
# MAP_F2A 0x30: 0x31 # upload 0xaf(upper bar) as 0x7e(tilde)
# MAP_F2A {: } # upload 0xaf(upper bar) as 0x7e(tilde)
# MAP_F2A }: { # upload 0xaf(upper bar) as 0x7e(tilde)
#
# MAP_E2A 0xa2: 0x5c # Yen sign and backslash
# MAP_A2E 0x5c: 0xa2 #
# MAP_E2A 0xa1: ~ # tilde and upper bar
# MAP_A2E ~: 0xa1 #
# MAP_E2A 0xa0: ? # tilde and upper bar
#
# MAP_E2A 0x25: ? # avoid 0x0a generation
# MAP_E2A 0x4a: ? # Cent, avoid DBCS output by CP939
# MAP_E2A 0x5f: ? # Not , avoid DBCS output by CP939
# MAP_E2A 0xb1: ? # Pond, avoid DBCS output by CP939
#
# MAP_E2A 0x31: 1 # Pond, avoid DBCS output by CP939
# MAP_E2A 0x32: 2 # Pond, avoid DBCS output by CP939
# MAP_E2A 0x33: 3 # Pond, avoid DBCS output by CP939
#
# SOSI_A2E INS : SOSI setting option when translate DBCS to EBCDIC
# SUBCHAR_DBCS 0x30fb
# SUBCHAR_SBCS 0x1a
# SUBCHAR_0a 1 # replace by SBCS substitution char.
# SUBCHAR_S2D 1 # replace converter output by substitution char when SBCS is translated to pc-codepage DBCS.
##################################################################################||~v124R
#
## Use ICU , SBCS codepage
#
# CONVERTER 1
# ICU_DLL_SUFFIX 44
# ICU_API_SUFFIX _44
# SBCS_CHARSET cp1047 //EBCDIC Latin/1 Open System(iso-8859-1)
#
## Use ICU , DBCS codepage
#
# CONVERTER 1
# ICU_DLL_SUFFIX 44
# ICU_API_SUFFIX _44
# DBCS_CHARSET cp1388 //chinese simplified. superset of cp935
#
## Use API (Windows:MultiByteToWideChar/WideCharToMultibute)
#
# CONVERTER 2
# SBCS_CHARSET 20924 //EBCDIC Latin/1 Open System(1047+Euro)
#
## Use API (Linux:iconv)
#
# CONVERTER 2
# SBCS_CHARSET cp1047
#
##################################################################################
#endif