すみません。
少し釈然としないものがあるので、
どうして文字化けして、そしてどのように解決したのか詳細が知りたいのですが。
おはようございます。
うまく説明できるかわかりませんが
文字化けの原因と解決方法を説明させていただきます。
[読み込む値]:'tEsカサ ギ17;6[R50@eARIGat'
while(( fgets( chstr, 6, fp )) != NULL ){
ここでの chstr の値の変化を順番に示します。
① 't'|'E'|'s'|'カ'|'サ'
② ' '|'キ'|'゛'|'1'|'★'
③ 'V'|・・・
と続きます。
ここで★の部分には'7'の1バイト目が入っています。
saraさんの言っていた、「欠落していた 0x82 」です。
>このコードと次の'V'(0x56)のコードの2バイトで 7になります。
マルチバイト文字をわけてしまったために文字化けが起こっていました。
解決策として chstr の最後にマルチバイトの1バイト目がきていれば
もう1バイト読みこむという処理を加えました。
NGAさん、このような説明で解ってもらえたでしょうか?
私も今回のことでとても勉強になりました。
みなさまありがとうございました。
おはようございます。
>while(( fgets( chstr, 6, fp )) != NULL ){
>① 't'|'E'|'s'|'カ'|'サ'
fgets で6文字読込を指定しているなら、最初の読込では 6 - 1 で5文字読み込まれて
0x74 0x45 0x73 0x83 0x4A 0x00 (tEsカ)となるはずですが。
それでは解決していないかもしれません・・・。
文字列の2バイトコードの1バイト目とは一種類ではありません。
’サ’の時がいけているのに’7’がいけない理由とは何か?
になると思います。また、1バイト目が欠落しているわけではなく、
続けてprintfで書いてるにかかわらず、でないのは変だと思います。
言語、OSなどに起因するものだと思います。
よろしければ、OSと使用言語をしりたいのですが・・・?
今後、扱う時に考えなければいけない事もありますのでm(__)m
彊
私も今気付きましたが
ここでは半角カナは使えないのですよね。
'カサ ギ'
の部分は本当は半角カナなのです。
ずっと全角で表示されているのに気付きませんでした。
この食い違いでNGAさんと結果が違っていたのかもしれませんね。
TAKAさん
1バイト目かどうかの判定は _ismbblead でしています。
環境は VC++,Win98SE です。
現象確認できました。
半角カタカナとは気づきませんでした。
ついでに'7'を全角カタカナにかえてためしてみて動きますか?
ちょっと気になったので・・・。
> 'キ'→-73
> '゛'→-34
この記述で半角カタカナだと気づくべきでした。
> ついでに'7'を全角カタカナにかえてためしてみて動きますか?
0x82が読み込まれているのだから、これはもともと全角ですよね?
> 0x82が読み込まれているのだから、これはもともと全角ですよね?
はいそうですが、全角カタカナを認識しない関数があるので・・・。
SPパックとかが入っていないと前にどの関数だったか覚えていませんが
認識できなかったことがあったので。
今はSPを入れたので動いていますが(^^)
そうですね。
もともと'7'は全角でした。
makotoさん、やはり一度テキストをバイナリで開いて16進であげてもらえませんか?
すみません。
バイナリで開くと言うのはどうやってやるのでしょう。
普通にファイルを読んで
fprintf(wfp, %02X , szMoji);
と16進で書きこめばいいのでしょうか?
これではうまくいかないのですが。
VCで[ファイル]→[開く]でファイルを選択し、[用途]をバイナリにしてから[開く]を押しま
す。
それで表示される16進コードをあげてもらえませんか?
NGAさん
ありがとうございます。できました。
000000 74 45 73 B6 BB 20 B7 DE 31 82 56 3B 36 5B 82 71
000010 35 30 40 65 41 52 49 82 66 82 81 74
カタカナは全て半角だったのですね。