【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18442

iconv によるコード変換プログラム
投稿者---かおり(2004/11/29 12:53:55)


こんにちわ。C 言語の開発歴1 年のかおりといいます。よろしくお願いします。
C 言語を使った汎用性のある文字コード変換プログラムを書いていますが、いまいち使い方が分かりません。ウェブ上のMAN マニュアルを見ても難しくて理解に困っています。

次のプログラムは配列 inbuff 配列に記載された日本語EUC 文字をJIS に変換してoutbuff 領域に書き出す処理なのですが、なぜ動かないのか教えてくれると幸いです。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iconv.h>

char errmsg[1024]; // エラーメッセージ

int main( int argc, char **argv ) {
size_t status; // ステータス
char *inbuffp; // 変換前データへのポインタ
char *outbuffp; // 変換後データへのポインタ
char inbuff[INBUFFSIZE]; // 変換前データ領域
size_t inbyte; // 変換前データ長
size_t outbyte; // 変換後データ長
iconv_t cd; // コード変換用ディスクプリタ

// 変数を初期化する
status = 1;
errmsg[0] = '?0';
inbuffp = NULL;
outbuffp = NULL;
inbuff[0] = '?0';
inbyte = 0;
outbyte = 0;
cd = 0;

// 変換する文字列を作成する
strcpy( inbuff, "てすと" );

// ● EUC → JIS 変換を行う

// コード変換前データ領域を作成する
inbuffp = inbuff;
inbyte = strlen( inbuffp );

outbuffp = (char *)malloc( sizeof(char)*(inbyte+1024));
memset( outbuffp, '?0', sizeof(outbuffp) );
outbyte = inbyte+1024;

// コード変換用ディスクリプタを開く
cd = iconv_open( "ISO-2022-JP", "EUC-JP" );
if( cd == (iconv_t)-1 ) {
sprintf( errmsg, "エラーが発生しました。" );

return -1;
}

printf( "EUC データ:%s
", inbuffp );

// コード変換を行う
status = iconv( cd, (const char **)&inbuffp, &inbyte, &outbuffp, &outbyte );
if( status == (size_t)-1 ) {
sprintf( errmsg, "エラーが発生しました。" );

return -1;
}

printf( "JIS データ:%s
", outbuffp );

// コード変換用ディスクプリタを閉じる
iconv_close( cd );

// コード変換後データ領域を解放する
free( outbuffp );

printf( "正常終了しました。" );

return 1;
}



コンパイル時に警告は出ますが、make は正常に行われます。上記で、出力する領域をmalloc で確保していますが、これが問題と思っています。なぜ問題かがわかりません。

お願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:iconv によるコード変換プログラム 18449 REE 2004/11/29 13:32:24


No.18449

Re:iconv によるコード変換プログラム
投稿者---REE(2004/11/29 13:32:24)


>C 言語を使った汎用性のある文字コード変換プログラムを書いていますが、いまいち使い方が分かりません。ウェブ上のMAN マニュアルを見ても難しくて理解に困っています。

自分で書いているプログラムの使い方が分からない?
もしかして、タイトルのiconvの使い方が分からないってことかな?
タイトルを読まなくても意味の分かる本文にしてください。

>次のプログラムは配列 inbuff 配列に記載された日本語EUC 文字をJIS に変換してoutbuff 領域に書き出す処理なのですが、なぜ動かないのか教えてくれると幸いです。

どう動かないのか教えてくれると幸いです。

※環境(OSとコンパイラ)や症状は具体的に詳しく!


>コンパイル時に警告は出ますが

その警告は、出ても問題ないことを自分で把握していますか?
意図していない警告は大抵、あなたのミスを教えてくれています。


この投稿にコメントする

削除パスワード

No.18450

Re:iconv によるコード変換プログラム
投稿者---かおり(2004/11/29 13:47:54)


REE さん。お返事ありがとうございます。

>>C 言語を使った汎用性のある文字コード変換プログラムを書いていますが、いまいち使い方が分かりません。

>自分で書いているプログラムの使い方が分からない?
>もしかして、タイトルのiconvの使い方が分からないってことかな?
>タイトルを読まなくても意味の分かる本文にしてください。

漠然とした質問で申し訳ありません。具体的には、iconv の使い方が分かっていないので、自分でプログラムしても動かない原因が分からないのだと思います。

例えば、先のメールで添付したプログラムで、iconv 関数に渡す引数はそれでよいのか?とか・・

>どう動かないのか教えてくれると幸いです。

先のプログラムをブラウザ経由で動かすと、本来であれば下記のような結果が得られると思うのです。

EUC データ:てすと
JIS データ:[JIS データに変換された (てすと) 文字列]
正常終了しました。

しかし、つぎのように、「JIS データ:」の結果部分が表示されないのです。ブラウザ上で実行してもINTERNAL SERVER ERROR 等のエラーはでませんし、make 時にもエラーはでないので原因がわからないのです。

EUC データ:てすと
JIS データ:
正常終了しました。

先のプログラムでoutbuffp を動的にメモリ確保しているところが怪しいと思っているのですが、なぜoutbuffp を動的にメモリ確保して正常に結果が得られないのかが分かりません。

>※環境(OSとコンパイラ)や症状は具体的に詳しく!

環境は次の通りです。あまり詳しくないので次の情報で分かるかどうか自身ありません。ごめんなさい。

OS : Mac OS X 10.3
コンパイラ:gcc version 3.3

>>コンパイル時に警告は出ますが

>その警告は、出ても問題ないことを自分で把握していますか?
>意図していない警告は大抵、あなたのミスを教えてくれています。

警告の意味は分かっています(型違いによるもの)。話を混乱させるかもしれませんが、先に記載したプログラムはこの警告を直したものです。

iconv( cd, (const char **)&inbuffp, &inbyte, &outbuffp, &outbyte );

上記の(const char **) を加えたら警告も無くなりましたので。。

お願いします。


この投稿にコメントする

削除パスワード

No.18451

Re:iconv によるコード変換プログラム
投稿者---かおり(2004/11/29 14:30:06)


自己レスです。

原因がわかりました。単純に結果の見方が悪かっただけでした。

結局、下記のようにすれば良い事が分かりました。題名と全く関係ないところが問題でした。もう少しC 言語の勉強をすべきと実感しました。ご迷惑おかけして申し訳ありませんでした。

char *outbuff;
char *outbuffp;
outbuff = NULL;

outbuff = (char *)malloc( sizeof(char)*(strlen(instring)+1024+1) );
if( outbuff == NULL ) return (char *)NULL;

outbuffp = outbuff;
[iconv] によってoutbuff に変換後文字列を記憶する
printf( "JIS コード:%s", outbuff );


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧