• 締切済み

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" に置き換えるとどうなりますか? これも結果は変わらずでした。