Re: FileRead_getsの引数について ( No.1 ) |
- 名前:oda 日時:2025/01/01 20:05
あの後進展があって、
int iRet = FileRead_gets( strStr, 480, iFileHandle ) ;
で読み込んだ文字列が
"3200 20 0"
ではなくて、
"3 2 0 0 2 0 0 "
と1文字ごとに半角スペースが入っていることがわかりました。
他の似たようなファイルだとこのような事は起きないので謎な現象です。
一部の環境でしか起きないのも謎です。
どのような原因が考えられますでしょうか?
解決方法はあるのでしょうか?
以上よろしくお願いいたします。
|
Re: FileRead_getsの引数について ( No.2 ) |
- 名前:管理人 日時:2025/01/01 22:24
リファレンスには載っていないのですが、FileRead_gets などで読み込むテキストファイルの
文字コード形式を指定するための関数 FileRead_set_format というものがありまして
// ファイルの文字コード形式を設定する( テキストファイル用 )
// FileHandle : ファイルハンドル
// CharCodeFormat : 文字コード形式
// DX_CHARCODEFORMAT_SHIFTJIS // シフトJISコード
// DX_CHARCODEFORMAT_GB2312 // 簡体字文字コード
// DX_CHARCODEFORMAT_UHC // ハングル文字コード
// DX_CHARCODEFORMAT_BIG5 // 繁体文字コード
// DX_CHARCODEFORMAT_UTF16LE // UTF-16 リトルエンディアン
// DX_CHARCODEFORMAT_UTF16BE // UTF-16 ビッグエンディアン
// DX_CHARCODEFORMAT_WINDOWS_1252 // 欧文(ラテン文字の文字コード)
// DX_CHARCODEFORMAT_ISO_IEC_8859_15 // 欧文(ラテン文字の文字コード)
// DX_CHARCODEFORMAT_UTF8 // UTF-8
// DX_CHARCODEFORMAT_ASCII // アスキー文字コード
// DX_CHARCODEFORMAT_UTF32LE // UTF-32 リトルエンディアン
// DX_CHARCODEFORMAT_UTF32BE // UTF-32 ビッグエンディアン
int FileRead_set_format( int FileHandle, int CharCodeFormat ) ;
通常はテキストファイルの文字コード形式を自動判定するのですが、原因は不明ですがその自動判定が
正常に完了しない環境があるのかもしれません
なので、FileRead_gets で読み込みを開始する前にこの関数で読み込むファイルの
文字コード形式を明示的に指定することで本件の問題を解消することができると思います
一文字ごとに半角スペースが入ってしまうとなるとテキストファイルの文字コード形式は
UTF-16 LE や UTF-16 BE となっている可能性が高いと思いますが、件のテキストファイルの
文字コード形式は何でしょうか?
|
Re: FileRead_getsの引数について ( No.3 ) |
- 名前:oda 日時:2025/01/02 08:58
管理人様
ご回答ありがとうございます。
テキストはUTF8です。
教えていただいた通りFileRead_openの後にすぐ
FileRead_set_format(iFileHandle, DX_CHARCODEFORMAT_UTF8);
をやってみましたがそれでも結果は同じく1文字ごとに半角スペースが入っていました。
他のテキストも全部UTF8で、他は異常が起きなくて、なぜかそのファイルだけ異常で、
しかもそのファイルも場合によっては正しく読み込まれたりもするとのことです。(条件は不明)
ひとまず、このファイルから読み込んだ文字列は
半角スペースを削除してから使う事で応急処置をしようかと思います。
|
Re: FileRead_getsの引数について ( No.4 ) |
- 名前:管理人 日時:2025/01/02 23:40
ご情報ありがとうございます
FileRead_set_format を使用しても駄目でしたか…
よろしければ件のファイルをメールでこちらのアドレスに
BQE00322(あっとまーく)nifty.com
( (あっとまーく) を @ に置き換えてください )
に送っていただけないでしょうか?
直接手元で現象が再現すれば原因も分かると思いますので… m(_ _)m
|
Re: FileRead_getsの引数について ( No.5 ) |
- 名前:管理人 日時:2025/01/04 00:06
テキストファイルをお送りいただきありがとうございます
ファイルを拝見する限りでは特に気になる点は無く、本件の現象が何故発生するのかは分かりませんでした…
こちらもリファレンスには載っていない関数なのですが、実行時に使用する文字コード形式は SetUseCharCodeFormat という
関数で指定することが出来、この関数による指定が無い場合は実行時のPCの言語設定によって自動的に使用する
文字コード形式が決定されるようになっています
( 例えば日本語環境ではデフォルトでは DX_CHARCODEFORMAT_SHIFTJIS が自動設定されます( 直に確認はできて
いませんが例えばハングル語環境ではデフォルトで DX_CHARCODEFORMAT_UHC が設定される…はず ) )
// 文字列の引数の文字コード形式を設定する( 文字列描画系関数とその他一部関数を除く )
// CharCodeFormat : 文字コード形式
// DX_CHARCODEFORMAT_SHIFTJIS // シフトJISコード
// DX_CHARCODEFORMAT_GB2312 // 簡体字文字コード
// DX_CHARCODEFORMAT_UHC // ハングル文字コード
// DX_CHARCODEFORMAT_BIG5 // 繁体文字コード
// DX_CHARCODEFORMAT_UTF16LE // UTF-16 リトルエンディアン
// DX_CHARCODEFORMAT_UTF16BE // UTF-16 ビッグエンディアン
// DX_CHARCODEFORMAT_WINDOWS_1252 // 欧文(ラテン文字の文字コード)
// DX_CHARCODEFORMAT_ISO_IEC_8859_15 // 欧文(ラテン文字の文字コード)
// DX_CHARCODEFORMAT_UTF8 // UTF-8
// DX_CHARCODEFORMAT_ASCII // アスキー文字コード
// DX_CHARCODEFORMAT_UTF32LE // UTF-32 リトルエンディアン
// DX_CHARCODEFORMAT_UTF32BE // UTF-32 ビッグエンディアン
int SetUseCharCodeFormat( int CharCodeFormat ) ;
言語環境によって本件の現象が発生したりしなかったりする可能性がある場合は、こちらの関数で明示的に
文字コード形式を指定することで直るかもしれません m(_ _)m
( 尚、例えばこの関数で SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); を実行して UTF-8 を使用する
設定にした場合は、LoadGraph や DrawString などの文字列を渡す関数全てで渡す文字列の文字コード形式を
UTF-8 にする必要がありますのでご注意ください )
|
Re: FileRead_getsの引数について ( No.6 ) |
- 名前:oda 日時:2025/01/05 12:56
ご返答ありがとうございます。
SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 );
をDxLib_Init() の前にやるようにしてみたところ、解決しませんでしたが、新たに分かったことがあります。
入っている文字が半角スペースだと思っていたのですが、実際は違ったようで、
謎の文字が入っていました。
ゲーム中表示できない文字(自分の作ったゲーム内フォントを使ったため)なので空白が表示されていたようです。
読み込んだものを別のファイルに出力してみたところ、
エイチティーティーピーエス://hensa40.cutegirl.jp/wp-content/uploads/2017/09/chartab_e.gif
この画像でいう「80」の行の左端の文字が入っていました。Cと=を重ねたようなやつです。
これが入っていたのだと思われます。
それと出力したテキストはなぜか「UTF8」じゃなくて「ANSI」になっていました。
とりあえず、読み込んだテキストから0〜9の数値と半角スペース以外取り除く対応を入れたら解決はできそうです。
以上よろしくお願いいたします。
|
Re: FileRead_getsの引数について ( No.7 ) |
- 名前:管理人 日時:2025/01/05 21:29
|
Re: FileRead_getsの引数について ( No.8 ) |
- 名前:oda 日時:2025/01/07 18:47
ご回答ありがとうございます。
暫定最新版を使ってテスターの方に確認していただいたところ、直っていました。
問題が起きていたバージョンは3.14でした。
すみません。バージョンを新しくするだけで解決する問題だったですね。
今後は定期的にバージョンを新しくするようにしたいと思います。
|
Re: FileRead_getsの引数について ( No.9 ) |
- 名前:管理人 日時:2025/01/09 04:53
最新版で直っていたとのことで何よりです
> すみません。バージョンを新しくするだけで解決する問題だったですね。
> 今後は定期的にバージョンを新しくするようにしたいと思います。
新しいバージョンで少し変化した処理によって今までに無かった不具合が
発生したりすることもありますので、今回のように何か問題が発生した際に
『最新版では直ってるかも』くらいの感覚で最新バージョンに更新して頂くのが
丁度良いかもしれません
|