- 締切済み
HP-UXにてiconv変換できません。
いつもお世話になっています。 当方、C言語初心者です。 環境 HP-UX 11.23 言語 C言語 他システムより接続された漢字コードに制御コードを付与し、JISコードに変更後、 JIS→SJISに変換するツールを開発しています。 たとえば 他システムより 0x3E3E 0x3B33(コードを調べると〔松山〕でした) 前後に制御コード付与すると 0x1B 0x24 0x42 0x3E3E 0x3B33 0x1B 0x28 0x4A JISで松山になります。 エディタで上記コードを読み込むと松山と表示されました。 ところが上記のJISを下記内容で実行させると、 入力値のコードがなんの変換もされず返却されました。 どこに不具合があって入力の内容(cvbuf)が出力の内容(ebuf)にそのまま返却されているのか調べることができませんでした。 何か見落としがあればご指摘のほど、宜しくお願い致します。 ※rlenをprintfしたところ正常返却されています。 ======================================================================= 呼び元は cvkanj(0x3E3E 0x3B33の内容が入ったアドレス,2) みないな感じです。 char *cvkanj(s, len) char *s; int *len; { char cvbuf[32768]; int rcd; staric char ebuf[32768] = {0}; static char ki[4] = { 0x1b, 0x24, 0x42, 0x00}; static char ko[4] = { 0x1b, 0x28, 0x4a, 0x00}; memcpy( cvbuf, ki, 3); memcpy( &cvbuf[3], s, len) memcpy( &cvbuf[len+3], ko, 3); cvbuf[len+6] = 0x00; rcd = convt(cvbuf, ebuf); return(&ebuf[0]); } int convt(pin, pout) char *pin; char *pout { iconv_t cd; size_t ilen; size_t olen; size_t rlen; ilen=strlen(pin); olen=32768; if ((cd = iconv_open("jis","sjis")) == (iconv_t)-1){ exit(-1); } rlen = iconv(cd, &pin, &ilen, &pout, &olen); iconv_close; return(0); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
よくみたら iconv_open に与える引数が逆ですね。 自分の手元では "jis" とか "sjis"はとおらないっぽいのでその辺いじって #include <stdio.h> #include <stdlib.h> #include <iconv.h> char * cvkanj(char *s, int len) { char cvbuf[32768]; int rcd; static char ebuf[32768] = {0}; static char ki[4] = { 0x1b, 0x24, 0x42, 0x00}; static char ko[4] = { 0x1b, 0x28, 0x4a, 0x00}; memcpy( cvbuf, ki, 3); memcpy( &cvbuf[3], s, len); memcpy( &cvbuf[len+3], ko, 3); cvbuf[len+6] = 0x00; rcd = convt(cvbuf, ebuf); return(&ebuf[0]); } int convt(char *pin, char *pout) { iconv_t cd; size_t ilen; size_t olen; size_t rlen; ilen=strlen(pin); olen=32768; if ((cd = iconv_open("SHIFT_JIS", "ISO-2022-JP")) == (iconv_t)-1){ //fprintf(stderr, "fail at iconv_open\n"); perror("fail at iconv_open: "); exit(-1); } rlen = iconv(cd, &pin, &ilen, &pout, &olen); fprintf(stderr, "rlen=%d\n", rlen); iconv_close; return(0); } int main() { char src[] = "\x3e\x3e\x3b\x33"; char *p; p = cvkanj(src, strlen(src)); printf("converted: %s\n", p); return 0; } こうしたら ShiftJIS で “松山” ってでてきました。 つーかさー、エラー返す関数呼び出して エラーになったら状況をチェックしようよ。 (typoとかを修正した)元のソースだと Invalid argument とかなりましたよ。
- sakusaker7
- ベストアンサー率62% (800/1280)
> int *len; 引数にポインタをとっておいて > memcpy( cvbuf, ki, 3); > memcpy( &cvbuf[3], s, len) > memcpy( &cvbuf[len+3], ko, 3); これはいくらなんでもまずいでしょう。 あとtypoがあるし、できれば元のソースをそのまま切り出してもらった方が。
- SAYKA
- ベストアンサー率34% (944/2776)
http://www.gnu.org/software/libiconv/ 一部抜粋 -------------------- Japanese EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP, ISO-2022-JP-2, ISO-2022-JP-1 -------------------- >if ((cd = iconv_open("jis","sjis")) == (iconv_t)-1){ どっちも存在しない文字コードを指定してるように見えるんだけど・・・?
補足
SAYAKAさま 回答ありがとうございます。 iconvは下記HPを参考に使用しました。 http://www.docs.hp.com/ja/B2355-90855/iconv.3C.html これによると --------------------------- fromcode 引き数および tocode 引き数は、構成ファイル /usr/lib/nls/iconv/config.iconv 内に対応するエントリーを持たなければなりません (「ファイル」の項を参照してください)。 --------------------------- とあり/usr/lib/nls/iconv/config.iconvをわからないなりに参照するとjisとsjisの単語が見つかりました。 ちなみにopenにxxx等のでたらめな値を設定すると、openで異常終了したので、jisとsjisはコード値としては問題ないかと考えています。 またお気づきの点がありましたらご指摘のほど宜しくお願いいたします。
補足
sakusaker7さま 回答ありがとうございます。 元ソースをコピペできる環境になく、印刷物を手で入力するときにエラー処理を省いたり、入力ミスをしてしまいました。 分かりにくくなり申し訳ありません。 試験までしていただきホントにありがとうございます! 松山の文字が帰ってきた、とのことなので、iconv_openのパラメータがわるいのかなー、と思えてきました。 "jis"指定が問題でISO-2022-JPとか、他に指定の方法があるのかも。。。。。 そのヘンを調べてみます! またご指摘事項があれば宜しくお願い致します。