ファイルの読み込み – 固定ページ 4 – プログラミング – Home

通知
すべてクリア

[解決済] ファイルの読み込み

固定ページ 4 / 5

NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

すみません。
少し釈然としないものがあるので、
どうして文字化けして、そしてどのように解決したのか詳細が知りたいのですが。


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

おはようございます。

うまく説明できるかわかりませんが
文字化けの原因と解決方法を説明させていただきます。

[読み込む値]:'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さん、このような説明で解ってもらえたでしょうか?

私も今回のことでとても勉強になりました。
みなさまありがとうございました。


返信引用
NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

おはようございます。

>while(( fgets( chstr, 6, fp )) != NULL ){
>① 't'|'E'|'s'|'カ'|'サ'

fgets で6文字読込を指定しているなら、最初の読込では 6 - 1 で5文字読み込まれて
0x74 0x45 0x73 0x83 0x4A 0x00 (tEsカ)となるはずですが。


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

それでは解決していないかもしれません・・・。
文字列の2バイトコードの1バイト目とは一種類ではありません。
’サ’の時がいけているのに’7’がいけない理由とは何か?
になると思います。また、1バイト目が欠落しているわけではなく、
続けてprintfで書いてるにかかわらず、でないのは変だと思います。
言語、OSなどに起因するものだと思います。
よろしければ、OSと使用言語をしりたいのですが・・・?
今後、扱う時に考えなければいけない事もありますのでm(__)m


返信引用
a
 a
(@a)
ゲスト
結合: 23年前
投稿: 59
 


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

私も今気付きましたが
ここでは半角カナは使えないのですよね。

'カサ ギ'
の部分は本当は半角カナなのです。
ずっと全角で表示されているのに気付きませんでした。

この食い違いでNGAさんと結果が違っていたのかもしれませんね。

TAKAさん
1バイト目かどうかの判定は _ismbblead でしています。

環境は VC++,Win98SE です。


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

現象確認できました。
半角カタカナとは気づきませんでした。
ついでに'7'を全角カタカナにかえてためしてみて動きますか?
ちょっと気になったので・・・。


返信引用
sara
 sara
(@sara)
ゲスト
結合: 23年前
投稿: 99
 

> 'キ'→-73
> '゛'→-34
この記述で半角カタカナだと気づくべきでした。

> ついでに'7'を全角カタカナにかえてためしてみて動きますか?
0x82が読み込まれているのだから、これはもともと全角ですよね?


返信引用
TAKA
 TAKA
(@TAKA)
ゲスト
結合: 23年前
投稿: 117
 

> 0x82が読み込まれているのだから、これはもともと全角ですよね?
はいそうですが、全角カタカナを認識しない関数があるので・・・。
SPパックとかが入っていないと前にどの関数だったか覚えていませんが
認識できなかったことがあったので。
今はSPを入れたので動いていますが(^^)


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

そうですね。
もともと'7'は全角でした。


返信引用
NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

makotoさん、やはり一度テキストをバイナリで開いて16進であげてもらえませんか?


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

すみません。
バイナリで開くと言うのはどうやってやるのでしょう。
普通にファイルを読んで
fprintf(wfp, %02X , szMoji);
と16進で書きこめばいいのでしょうか?
これではうまくいかないのですが。


返信引用
NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

VCで[ファイル]→[開く]でファイルを選択し、[用途]をバイナリにしてから[開く]を押しま
す。
それで表示される16進コードをあげてもらえませんか?


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

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


返信引用
NGA
 NGA
(@NGA)
ゲスト
結合: 23年前
投稿: 98
 

カタカナは全て半角だったのですね。


返信引用
固定ページ 4 / 5

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました