2010/07/25

#if defined(W32) || defined(LNX)

   .EBCDICファイルサポート。

     (CV コマンド、、XCV ユーティリティー、cfg ファイルの設定については次のEBCDIC変換も見て下さい)

     -ロケールコードに変換せずに直接編集、HEX表示はEBCDICコードを表示します。
      メインフレームのEBCDICファイルを無変換でダウンロードしたファイルを編集したり
      無変換オプションでEBCDICファイルをNFSマウントして編集する場合を想定しています
      sshfs(Windowsには Dokan sshfs があります) で Linux/390 にアクセスする場合にも使用できます
      画面にはユニコードで出力するのでローカルのコードページにない文字も表示可能です。
      EBCDICコンバータは省略値が日本語環境はCP930,日本語環境以外ではCP037です。
      これはローカルの環境のことですのでリモートの環境がローカルと異なる場合は
      cfg ファイルで コンバータを指定してください。
      wxeで文字化けする場合SetupダイアログでcharsetもDefault以外を試して見て下さい。

     -EDIt/SAVe/REPlace/CREate/APPend/CUT/END/COPy/MOVe/PASte コマンドで CPEB オプションを指定
      不正なEBCDIC文字があるときこれを無視して開く時は IE オプションを指定する。
      ヘッダー行には "=E" , バイナリーモードの場合は "=e" で表示されます
        例。 "e file1 cpeb"

      cfg無しの場合あるいはcfg以外のコードページを使用する場合は CPEB:codepage の形式を使用します
        例。 "e file1 cpeb:IBM1047"
      cfg に戻す時には "CPEB=" のように空白のコードページを指定する
      セッションにつき最大7種類のコードページが使用できます。
      xe は 別名を認識できないので同じコードページには決まった名前を使用してください。

      COPy/MOVe/PASte コマンドは指定のコードページからコピー先のコードページに変換され、
      SAVe/REPlace/CREate/APPend/CUT/ENDでは指定のコードページに変換して出力されます。
        例。 "rep file2 cpeb nx ie"
      出力時のオプションはプロファイルに記録されるので1度指定すればセッションを跨って有効です。
      またCOPy/MOVe/PASte コマンドはプロファイルの記録をチェックするので通常はCPxxの指定は不要でしょう。
      但しセッション間で cfg の CONVERTER パラメータを ICU から ICU 以外に変更、
      またはその逆の変更をするとネイミングが異なるため、コードページが見つからない結果になる可能性がある。
      そのため Cut&Paste の Paste の時 "無効なコードページ" のエラーが出ることもあります。
      その場合はcfgに従って変換される。
      セッション間で CONVERTER パラメータを変更した場合は改めて CPEB=xxxを指定してください。

      COPy/MOVe/PASte コマンドでプロファイルの記録に従った変換をしたくない場合は
      "B"(Binaryモード)サフィックスを指定してください
      Binaryモードは複写先:UTF8ファイルはサポートされません。
      "B"サフィックスの指定は下記、コピー行コマンドの場合と同じです。

      デレクトリーリストを開く時のCPEBオプションはフォルダー内のファイルの省略値となります。
      他のオプション(CPLC/CPU8/CPAS)で開くとプロファイルは上書きされます。
      尚、コードページは "TOP OF LINE" と "END OF LINE" 行に表示されます。

      出力コマンドで変換エラーがあるときも最後まで出力されますがプロファイルは更新されません。
      変換エラー文字は代替文字に置換されます。
      代替文字はコードページ依存ですが cfg ファイルで設定できます(外部コンバーター使用の場合)。
      DBCSの代替文字は定義されてない場合 u-fffd,u-ff1f(DBCS "?"),u-3000(DBCS space)の順に
      変換可能なものを採用します。

     -行コマンド "C"/"M" でも コピー元とコピー先のコードページが異なれば変換されます。
      変換したくない場合は "B"(Binaryモード)サフィックスを指定してください
      Binaryモードは複写元、先とも UTF8ファイルはサポートされません。
      ロケールファイル-->EBCDICファイルのとき TAB(0x09)拡張によるスペースは削除されます。
        {A|B}[B][C][n][,b][.s]
          A : After, B: Before, B : Binary Mode, C : Copy with CID
          n : repeat, b : bandle, s : skip
        例) c3
             :       Copy 3 lines After by Binary mode
             ab

     -行コマンド "=" でも コピー元とコピー先のコードページが異なれば変換されます。
      (UTF8、ロケールコードファイルとの比較ではEBCDIC-->UTF8,ロケール変換後に比較されます)
      Binaryモードで比較したい場合は "B"(Binaryモード)サフィックスを指定してください
      Binaryモードは UTF8ファイルではサポートされません。
      ロケールファイル-->EBCDICファイルのとき TAB(0x09)拡張によるスペースは無視されます。
        =[B][n][,b][.s]
        ==[B]
      (どこか一箇所に"B"をつけてください。)

     -CV コマンドは CPLC(Locale コード)ファイルに対して B2M/M2B を使用できます。
      変換オプションは前記のcfgファイルを共用します。 -MFcfgfile  オプションは廃止です。

      B2M/M2B で CPEB:ebcidc-codepage パラメータを指定することで mapping cfg 以外の
      EBCDIC コードページで変換できます。
      EBCDIC ファイルを開いて B2M する場合は CPEB を省略するとそのファイルのコードページが使用されます。
        例) cv m2b cpeb:37
      EBCDICファイルのコードページを変更する場合は B2B オプションを使用してください
        例) cv b2b cpeb:1026
      但し、ファイルのコードページ属性は変更してないので画面表示は元のコードぺーじで表示される。
      新しいコードページに移行するには SETCP オプションを指定してください。
        例) cv b2b cpeb:1026 SETCP

     -EBC コマンド。

      EBC コマンドでもコードページを変更できます。
        例) EBC SETCP=CP935
      EBC コマンドでは元のデータは変更されません。指定のコードページに従って表示されます。
      従って他に変更がなければ保存操作でファイルは書き直されません。
      UNDo機能で、EBC/CV コマンドの SETCP オプションで設定したコードページは戻されます。
      SETCP オプションで設定したコードページはファイルを保存するとプロファイルに記録されます。
      "EBC SETCP=" で省略値のコードページに戻ります。

     -xcv ユーティリティー

        B2M/M2B で "m"は現在のローカルコードページで"b"はebcmapfileで指定するか-CPEB:で指定します
          例) xcv -cb2b -f:37 -t:1026 ebcfile1 -oebcfile2
        EBCDICのコードページを変更する場合は B2B を使用してください。
          例) xcv -cb2b -f:37 -t:1026 ebcfile1 ebcfile2
        ICU コンバータを使用する場合は -mf: で指定のcfg ファイルで CONVERTER=1 を指定してするか
        -ICU オプションを指定してください
          例) xcv -cb2b -f:IBM037 -t:IBM1047 -mf:xeebc.map ebcfile1 ebcfile2
              xcv -cb2b -f:IBM037 -t:IBM1047 -ICU          ebcfile1 ebcfile2

     -改行文字。
        cfgファイルの改行コードの変換指定はREPlaceコマンドなどで変換出力
        するときに適用されますが、編集表示ではファイルは0x15 を 行末文字として行分割されます。
        行末文字とレコードモードのLRECL指定を以下のコマンドでサポート。
        LRECLの変更も可能。
          EDIt/BROwse, END, CREate/REPlace, SAVe, COPy/MOVe。
        但しSAVeはファイル名指定のときのみ指定可能
        COPy/MOVe コマンドの Fxx は コピー元のLRECLの指定になります。
        尚 レコードモードのON/OFF, LRECL はプロファイルに保存しますが
        行末文字の指定は省略値以外は毎回指定が必要です。

            /M{t|p|u|m|e|r} /Fnn[-mm]
              e:EBCDIC-NL(0x15), r;RecordMode, nn:LRECL
        例。
            e ebcf1 CPEB                        : EBCDIC ファイルテキストモード(行末文字=0x15)
            e ebcf1 CPEB  /mp                   : EBCDIC ファイルテキストモード(行末文字=0x0d0a)
            e ebcf1 CPEB  /mr /F72              : EBCDIC ファイル固定長レコードモード(LRECL=72)
                                                  LRECLの省略地は80.
            end /mu                             : 行末文字を 0x0a に変更。
            end /mr /f80                        : LRECL=80の固定長ファイル(行末文字無し)として保存。
            s ebcf1 CPEB /mr /F80               : (PC ファイルから) EBCDIC ファイルに変換。
                                                  出力はLRECL=80の固定長ファイル。
            rep u8f1 nx CPU8 /mp                : (固定長EBCDICファイルから) UTF8 ファイルに変換。
                                                  各行に行末文字0x0d0a追加されます。

     -DBCS について
      EBCDIC では 2バイト文字は SO(0x0e)とSI(0x0f)で囲まれます。例えば 0e-40-40-0f で DBCS のスペース。
      SO/SIは1文字ずつ囲む必要はなく文字列を囲みます。
      EBCDIC 以外では DBCS は 特定のLeadingバイト(>=0x80)と次の文字の組み合わせです。
      3バイト(EUC-SS3),4バイト(GB18030)の場合もあります。 DBCSスペースは例えば MS932 では 81-40 です。
      従ってEBCDIC<-->ロケールコードページの変換では行の長さが変わります。
      コマンドのオプションででSO/SIの扱いを指定してください。
      省略値はcfg ファイルで指定する。行コマンドのCopyはパラメータ指定できないのでcfgが適用されます。
        例.   COPy     file1 cpeb -sd       :EBCDIC ファイルを画面内にコピーする時 SO/SI を削除。
              COPy     file1 cpeb -sr       :SO/SIはスペース置換されます。行長が変わりません。
              REPlace  file1 cpeb -sr       :EBCDIC に変換して出力する時 SO/SIが挿入されるが
                                             前後がスペースであればそれを置き換える。
              REPlace  file1 cpeb -si       :SO/SIが挿入されるので行長が変わります。
      cfg では省略値を設定します。
          SOSI_A2E      REP (="-sr") または INS ("=-si")
          SOSI_E2A      DEL (="-sd") または REP ("=-sr")

     -コードページ、オプションは cfg ファイルで指定。
        形式は従来 3270接続 で使用したものと共通です。
        cfgファイルがない時の省略値は以下のようになります。
          (Windows)
            日本語環境のとき コードページはCP930(日本語カタカナ拡張、内部変換テーブル)、JIS83 で画面表示されます。
            日本語環境以外の コードページはCP037で画面表示。DBCS(SO/SI)は考慮されません
          (Linux)
            日本語環境のとき コードページはEUC-JP(日本語カタカナ拡張、内部変換テーブル)、JIS83 で画面表示されます。
            日本語環境以外の コードページはCP037で画面表示。DBCS(SO/SI)は考慮されません
          cfg ファイルで CONVERTER=0 を指定した時もコードページの省略値は同じですが
          SOSI,SJIS オプションを指定することが出来ます。
          但しSOSIオプションは CV コマンドに対してのみに有効で、編集では無視されます(0x0E/0x0Fで表示)

        (例)外部、Windowsの変換テーブルを使用するときはcfgファイルで以下のように指定します
              コントロールパネル->地域と言語のオプションで追加が必要かもしれません。
              Windows では DBCS はサポートされてないようです。
              従って日本語以外のCJKではWindowsではICUの導入が必要となります。
              ICU を使用する場合 DLL/so のPATHを設定する必要があるかもしれません。
              PATH(LIBPATH は使用されません) / LD_LIBRARY_PATH などOSにあわせて設定してください。

              CHARSETで指定する値はICU/Windows/LinuxICONVなどで異なります
              文字セットのリストは "uconv -l"(ICU) ないし "iconv -l" で得ることができます。
              Windows の CP はコントロールパネル->地域と言語のオプションで調べる。

              -ICU を使用:SBCS言語
                 CONVERTER          1
                 ICU_DLL_SUFFIX    44
                 ICU_API_SUFFIX   _44
                 SBCS_CHARSET     cp1047          //EBCDIC Latin/1 Open System(iso-8859-1)

              -ICU を使用:DBCS言語
                 CONVERTER          1
                 ICU_DLL_SUFFIX    44
                 ICU_API_SUFFIX   _44
                 DBCS_CHARSET     cp1388          //chinese simplified. superset of cp935

              -Windows の MultiByteToWideChar/WideCharToMultibute API を使用
                 CONVERTER          2
                 SBCS_CHARSET       20924        //EBCDIC Latin/1 Open System(1047+Euro)

              -Linux の iconv API を使用
                 CONVERTER          2
                 SBCS_CHARSET       cp1047

        改行コードの変換は実用と定義とが不明確になっています
            EBCDIC NL(x15)-->u0085, LF(x25)-->u000a
            ASCII  LF(0x0a)-->EBC-15/EBC-25
        コードページの変換を変更したい時は次のオプションを指定してください。
            MAP_E2A  0x15: 0x0a   # EBCDIC 0x15(NL) -> ASCII 0a(LF)
            MAP_E2A  0x25: 0x3b   # EBCDIC 0x25(LF) -> ASCII "?"
            MAP_A2E  0x0a: 0x15   # EBCDIC 0x15(NL) <- ASCII 0a(LF)


     -CV コマンドは CPLC(Locale コード)ファイルに対して B2M/M2B を使用できます。
      CPEBで開いたファイルには使えません REP コマンドなどで変換してください
      変換オプションは前記のcfgファイルを共用します。 -MFcfgfile  オプションは廃止です。
      B2M はロケールコードまで変換するので変換エラー表示の可能性(代替文字表示)が高くなります。
      編集ではユニコード変換した後にローケールコード変換せずに表示しています。

     -0x09はタブとしては扱われません。(0x05もタブとはしません)
      文字挿入モード時のTabキーは0x09の挿入ではなく文字置換モード時と同様タブジャンプとなります
     -HEX入力モード(Ctrl+F11)の時DBCS考慮はなく1バイトづつ画面に送られます。
     -SO(0x0e)/SI(0x0f):DBCS 囲み文字は "?" で表示されます。
      DBCS入力時はSO)/SIが挿入されます。
      EBCファイルからCut&Pasteの場合SO/SIで囲まれて初めて(偶数バイトのみ)DBCS評価されます。
      例えば、UTF8/ロケールコードファイルにPasteする場合コード変換されますがSO/SIも
      一緒にCopyしてないとSBCS変換されます。
      DBCS位置でSplit行コマンドで行分割された後、
      Join 行コマンドでの行連結ではDBCS評価され得ますがTflow コマンドは間に1スペース
      挿入するのでもとには戻りません。
      無効なDBCS-EBCDICは ":;" で画面表示されます。縦HEX表示でHexコードを確認してください。
     -バイナリーモードで開くと(EB コマンド) DBCSは考慮されません(SO/SIは無変換でコピーされます)
      制御文字が多すぎてバイナリーモードと判定された場合は ET コマンドで開いてください。
     -Find/Change コマンド。
        kbdのUTF8モードにかかわらずEBCDICコードで探索、置換します。
        バイナリーモードで開いた時はDBCSは考慮されません
        -g (Grep), P'.' 探索はサポートされていません。
     -TFLow コマンドで 行が連結される場合連結部には1スペースが挿入されるので
      奇数桁になり、通常は前の行の SO と 次の行の SI が DBCSを再構成することはないでしょう。
     - "#" 行コマンド(その行に記述を Native コマンドとして実行) はサポートされません。

#endif