アプリ版:「スタンプのみでお礼する」機能のリリースについて

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の別コードへの変換するプログラムサンプルがありましたら、
おしえてください。お願いします。

A 回答 (3件)

詳しくはありませんが、ISO2022自体はコードセットではありません。


「文字セットを切り替える方法を定めた国際規格」ということのようです。
こちらをご覧下さい。
http://www.rfs.jp/sitebuilder/perl/08/01_02.html
http://www.kanzaki.com/docs/jcode.html
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました。

教えていただいたURLを参考になんとか理解しつつあります。

ほんとうにありがとうございます。

お礼日時:2003/02/12 01:31

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個)となりそうです。しかし、この仮定がなりたつかどうかはわかりません。文脈しだいです。
    • good
    • 0
この回答へのお礼

本当にご回答ありがとうございます。

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

お礼日時:2003/02/12 01:29

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と解釈すればいいだけです。どれだけ簡略化できるかは入力の範囲しだいということです。
    • good
    • 0
この回答へのお礼

今、後者の方法しかないかなぁと悩んでいたとこでした。
ご回答の内容をみて少し気が楽になれました。
(かれこれ、12hはまっていたので。涙涙涙。)

入力に関する裏は、明日昼間確認してみたいと思います。

質問してほんとうによかったです。
ありがとうございました。

お礼日時:2003/02/12 02:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!