みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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使うときは気をつけなきゃだめなことがあるんでしょうか?
なんでこうなるのかわかる方がいたら教えてください。

投稿日時 - 2008-09-03 20:54:49

QNo.4301399

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

>神石高原町
この文字列だけを変換する小さなプログラムを作って、それで試してみたらどうなりますか?

それから、
>この関数に「神石高原町」を与えて返ってきた文字をファイルに出力して、
> 秀丸の文字コードUTF-8で開くと変換できなかった文字が「神」の前にあり、文字も「神石高原」になるし・・・。

「文字列」じゃなくて「文字」が「神石高原」の「神」の前にあるんですか?
それとも、shift-jis だと「神石高原町」になるデータがそっくり
あるのでしょうか?

もう一つ。
> cd = iconv_open( "UTF-8", "SJIS-WIN" );
"SJIS-WIN"を "SJIS" に置き換えるとどうなりますか?

投稿日時 - 2008-09-04 16:47:19

お礼

sakusaker7さん、回答、感謝です。

>神石高原町
>この文字列だけを変換する小さなプログラムを作って、それで試してみたらどうなりますか?

結果は同じでした。

>「文字列」じゃなくて「文字」が「神石高原」の「神」の前にあるんですか?
>それとも、shift-jis だと「神石高原町」になるデータがそっくりあるのでしょうか?

説明がまずかったですね。
秀丸で文字コードUTF-8で開くと変換できない文字がありますというメッセージが出て、
変換できない文字にジャンプができるのでジャンプしてみると「神」の前にジャンプするだけで、
実際に「神」の前にテキストエディタ上では文字は見えません。
で、バイナリエディタで開いたら「神」にあたる値(E7 A5 9E)の前に「A1」って値が入ってました。
変換した文字列の中にgccの制御コードになる値でも入ってるのかなぁ。

>"SJIS-WIN"を "SJIS" に置き換えるとどうなりますか?
これも結果は変わらずでした。

投稿日時 - 2008-09-04 18:32:55

あなたにオススメの質問