• 締切済み

gccでiconvを使った文字コード変換で文字化け?

Linuxでgccを使ってプログラムを作っていますが、文字コード変換が一部分うまくいかなくて困ってます。 Shift-JISで作られたテキストファイルから一行ずつ文字を読み込んで、 それをUTF-8に変換して画面に出力しているんですが、 「神石高原町」だけ文字化けしているのか、表示されません。 前後の行は表示されるのでちょうど1行空白になる感じです。 とりあえず変換用に作った関数。 BOOL SJIStoUTF( char* pin, // (IN) 変換元文字列 char* pout, // (OUT) 変換後文字列格納領域 size_t olen) // (IN) 変換後文字列格納領域サイズ { iconv_t cd; size_t ilen, rlen; cd = iconv_open( "UTF-8", "SJIS-WIN" ); ilen = strlen( pin ); rlen = iconv(cd, &pin, &ilen, &pout, &olen ); if( rlen == -1 ){ printf( "ERROR in S2U (%s)\n", pin ); return FALSE; } *pout = '\0'; iconv_close( cd ); return TRUE; } この関数に「神石高原町」を与えて返ってきた文字をファイルに出力して、 秀丸の文字コードUTF-8で開くと変換できなかった文字が「神」の前にあり、文字も「神石高原」になるし・・・。 Linuxのコンソール上でiconvのコマンド使ってファイルごと変換すれば 文字化けしないんですけど、 gccでiconv使うときは気をつけなきゃだめなことがあるんでしょうか? なんでこうなるのかわかる方がいたら教えてください。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>神石高原町 この文字列だけを変換する小さなプログラムを作って、それで試してみたらどうなりますか? それから、 >この関数に「神石高原町」を与えて返ってきた文字をファイルに出力して、 > 秀丸の文字コードUTF-8で開くと変換できなかった文字が「神」の前にあり、文字も「神石高原」になるし・・・。 「文字列」じゃなくて「文字」が「神石高原」の「神」の前にあるんですか? それとも、shift-jis だと「神石高原町」になるデータがそっくり あるのでしょうか? もう一つ。 > cd = iconv_open( "UTF-8", "SJIS-WIN" ); "SJIS-WIN"を "SJIS" に置き換えるとどうなりますか?

tokotoko_w
質問者

お礼

sakusaker7さん、回答、感謝です。 >神石高原町 >この文字列だけを変換する小さなプログラムを作って、それで試してみたらどうなりますか? 結果は同じでした。 >「文字列」じゃなくて「文字」が「神石高原」の「神」の前にあるんですか? >それとも、shift-jis だと「神石高原町」になるデータがそっくりあるのでしょうか? 説明がまずかったですね。 秀丸で文字コードUTF-8で開くと変換できない文字がありますというメッセージが出て、 変換できない文字にジャンプができるのでジャンプしてみると「神」の前にジャンプするだけで、 実際に「神」の前にテキストエディタ上では文字は見えません。 で、バイナリエディタで開いたら「神」にあたる値(E7 A5 9E)の前に「A1」って値が入ってました。 変換した文字列の中にgccの制御コードになる値でも入ってるのかなぁ。 >"SJIS-WIN"を "SJIS" に置き換えるとどうなりますか? これも結果は変わらずでした。

関連するQ&A

  • 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); }

  • ファイルiconvについて

    UNIXのコード・セット間での文字の変換ファイルiconvの 標準形式iconv( iconv_t cd, const char **inbuf, size_t *inbytesleft,char **outbuf, size_t *outbytesleft ); の第二引数は”const”ない場合、どんな影響及ぼしますか?ご教授ください。

  • iconv_open失敗

    いつもお世話になっております。 OpenIndiana NetBeansIDE 7.1でc++のプログラミングをしているのですが、下記コードで SHIFT-JISを指定すると iconv open: Invalid argument となってしまいます。 SHIFT-JISの文字コード関係の何かのインストール等が不足しているのでしょうか。 locale -a というコマンドを実行してみたのですが、 UTF-8に関係しそうなものは入っていたのですが、SHIFT-JIS(PCK?) のようなものは入ってなさそうでした。 どなたかご教授よろしくお願いいたします。 どなたかご教授よろしくお願いいたします。 int main(int argc, char** argv) { int ret; // ret = convert("UTF-8", "EUC-JP",//成功 // ret = convert("UTF-8", "SHIFT_JIS", ret = convert("UTF-8", "SHIFT-JIS", "日本語テストメッセージおはよう", outbuf, sizeof(outbuf)); if (ret) { printf("%s\n", outbuf); } else { printf("Oops!\n"); } return 0; } int convert(char const *src, char const *dest, char const *text, char *buf, size_t bufsize) { iconv_t cd; size_t srclen, destlen; size_t ret; cd = iconv_open(dest, src); if (cd == (iconv_t)-1) { perror("iconv open"); return 0; } srclen = strlen(text); destlen = bufsize - 1; memset(buf, '\0', bufsize); ret = iconv(cd, &text, &srclen, &buf, &destlen); if (ret == -1) { perror("iconv"); return 0; } iconv_close(cd); return 1; }

  • iconvでSJIS→UTF-8に変換できない文字

    cygwin1.7.31 の iconv を使って50個程度のShift-JISのcsvファイルをUTF-8に 一斉に変換しようとしていますが、 レコード内に「(1)」という文字があるためか、出力が止まってしまいました。 このような文字を含む場合も変換する方法がございましたらご教示ください。 お願いします。 入力したコマンドは次の通りです。 iconv -f Shift_JIS -t UTF-8 abc.csv > test.csv エラーメッセージ iconv: abc.csv:36:30: cannot convert

  • c言語 iconv

    msys環境で実行して,指定されたファイルの文字コードをShift-JISに変換して表示するコードを作成しているのですがうまく表示されません.何がいけないのでしょうか.第1引数に変換対象のファイル名,第2引数にファイルの文字コードを指定しています. #include <stdio.h> #include <string.h> #include <iconv.h> int main(int argc, char *argv[]) { iconv_t conv; char src[10000]; char dst[10000]; int src_len = strlen(src); int dst_len = sizeof(dst) - 1; char *buf_in; char *buf_out; FILE *fp; fp = fopen(argv[1], "r"); if(NULL == fp) { printf("ファイルを開けません\n"); } else { while(fgets(src, 10000, fp) != NULL) { buf_in = src; buf_out = dst; /* 変換器を作成 */ conv = iconv_open("Shift-JIS", argv[2]); /* 変換 */ iconv(conv, &buf_in, &src_len, &buf_out, &dst_len); *buf_out = '\0'; /* 終末処理 */ /* 文字コード後の文字列を表示 */ printf("%s\n", dst); } /* 変換器を終了 */ iconv_close(conv); /*ファイルを閉じる*/ fclose(fp); } return 0; }

  • iconv_openで「II」(ギリシャ文字)を変換できない

    Linux 上で以下のようなプログラム(文字コードのEUC/SJIS変換)を実行すると「II」が変換できず(正確にはNULLになってしまう。)に文字列が破壊されてしまいます。 実際使用するデータの中には「II」が存在するので、この文字(ギリシャ文字全部?その他にもありますかね?)を使用不可とするのは難しいので、上手く変換できるようにしたいのですが、iconv_openの代わりになる関数(あるいは上手く変換させる方法)ってありませんか? #include <stdlib.h> #include <iconv.h> int main(int ac,char **av){ int desc = 0; char r[512]; char w[512]; char *rr; char *ww; rr = r; ww = w; int a,b; a = 256; b = 256; if((desc = iconv_open( "SHIFT-JIS", "EUC-JP" )) != -1){ strcpy(r,"aIIa\n"); iconv(desc,&rr,&a,&ww,&b); printf("%s\n",w); } }

  • 文字コード変換時の文字化けについて

    HP-UX上で、文字コードUTF8のファイルをiconvにてSJISに変換して利用しています。 その際、¥(全角円マーク)、―(全角ダッシュ)、‐(全角ハイフン) などが文字化けしてしまいます。 shell内にて処理できればよいので、iconvでなくても結構ですが、文字化けしない方法をご存じ方がいらっしゃれば教えていただけると幸いです。 よろしくおねがいいたします。

  • ファイルコードの変換の問題

    現在、shift-jis ファイルをUTF-8に変換するところです。 使っているソフトはGNU の iconvです。バージョン1.10です。 iconv -f SHIFT_JIS -t UTF-8 a.txt > b.txt で文字コードが変換されていない 詳しい方が教えていただけないでしょうか

  • 現在の文字コードの確認

    お世話になります。 以下のシェルスクリプトでテキストファイルの文字コードをUTF8に変換したあと、 返還後の文字コードを確認するステップを追加したいと考えています。 ------------------------------------- #!/bin/sh for f in `ls *.txt` do iconv -f SJIS -t UTF8 < $f > utf8-$f done ------------------------------------- 次のようなスクリプトを作成しましたが正常に処理が行われませんでした。 どのように記述すればよいでしょうか。 ------------------------------------- #!/bin/sh for f in `ls *.txt` do iconv -f SJIS -t UTF8 < $f > utf8-$f nkf -g < $f > done ------------------------------------- ご協力のほどよろしくお願いいたします。

  • ファイルの変換についての質問(iconv)

    ファイルの文字コードを変換したいということですので、 ファイルの文字コードは、shift-jisからBomがつくUTF-8ファイルに変換 するつもりです。 現在使っているソフトは GNU の iconvです。 OSはWindowsXpです。 どうやってMS-DOSからファイルをBomが付くUTF-8のファイルにします? なんの設定する必要がありますか?

専門家に質問してみよう