• ベストアンサー

ISO2022⇒SJIS

ISO2022⇒SJIS のコード変換ではまってます。 以下のISO2022のコード体系で表されたデータをSJISに変換したいのですが、 「1b6f 3b30 0f20 1b6f 3066 0f20 1b6f 3b33 0f20 2020 2000」 UNIXのコマンドのiconv で変換すると iconv -f ISO-2022-JP -t SJIS test.bin iconv: 変換エラーです。 変換エラーが検出されました。 となってしまいます。 ということは、ISO2022 と ISO-2022-JP は別のコード体系なのでしょうか? ISO2022の別コードへの変換するプログラムサンプルがありましたら、 おしえてください。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

ISO 2022全体はかなり複雑なので、たしかにこれを完全に解釈するような実装は時間がかかると思います。 サンプルとしては端末エミュレータのktermあたりがあるでしょうか。ktermのソースはどこにでもあると思います。文字コードにかかわる部分は、状態遷移表のVTPrsTbl.cと、その解釈実行するcharproc.cでしょうか。ESCが来たらESC用の表に切り替え、その状態でoが来たらLS3として解釈するというようなことをしています。ISO 2022にかかわらない端末制御がらみのシーケンスの解釈もしますので、これをそのまま持っていっても無意味だし、読むだけでも混乱のもとになるかもしれません。注意が必要です。 もっと現実的な路線としては、ISO 2022のうち何が入力されうるのか、しっかり見極めることでしょう。もし文字集合のdesignateがあらかじめ決まっていて固定され、LS3とSIしかこないのであれば、プログラムは劇的に簡単になります。ESC oが来たら以降2byteずつJISコードとして解釈し、SIが来たら以降はASCIIと解釈すればいいだけです。どれだけ簡略化できるかは入力の範囲しだいということです。

yankee5
質問者

お礼

今、後者の方法しかないかなぁと悩んでいたとこでした。 ご回答の内容をみて少し気が楽になれました。 (かれこれ、12hはまっていたので。涙涙涙。) 入力に関する裏は、明日昼間確認してみたいと思います。 質問してほんとうによかったです。 ありがとうございました。

その他の回答 (2)

回答No.2

No1の方のとおり、ISO 2022は、国際的な文字集合を切り替えながら使用するための枠組みです。ISO-2022-JPはその枠組みの範囲内で日本の文字を効率的に扱うようにした非常に小さな部分集合といえます。 詳細はISOの文書を参照してほしいのですが、ESC oはG3にdesignateされている文字集合をGLに固定的にinvokeするという意味で、それ以降のコードがどの文字をあらわすかを規定します。SI(0x0f)はG0をGLにinvokeします。これらを使った表現はもちろんISO 2022には準じていますが、ISO-2022-JPでは使われないことになっています。よって、jconvやnkfをはじめとする世の中のコード変換ツールではまず対応できないでしょう。 G3にJIS X0208がdesignateされていて、G0にASCIIがdesignateされているとすると、ご質問の文字列は "三_井_山___" (_はスペース1個)となりそうです。しかし、この仮定がなりたつかどうかはわかりません。文脈しだいです。

yankee5
質問者

お礼

本当にご回答ありがとうございます。 仮定の方は、ずばりその通りでした。 ただ、私がISOの文書を参考にCでPGを作るには時間がかかりそうで、 少々焦ってます。 どこかにサンプルが落ちていないものでしょうか? さらにご回答いただけると幸いです。

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.1

詳しくはありませんが、ISO2022自体はコードセットではありません。 「文字セットを切り替える方法を定めた国際規格」ということのようです。 こちらをご覧下さい。 http://www.rfs.jp/sitebuilder/perl/08/01_02.html http://www.kanzaki.com/docs/jcode.html

yankee5
質問者

お礼

早速のご回答ありがとうございました。 教えていただいたURLを参考になんとか理解しつつあります。 ほんとうにありがとうございます。

関連するQ&A