Re: windows版を基本に、androidにも移植しやすい環境について ( No.1 ) |
- 名前:管理人 日時:2020/08/20 00:09
> ↑のやり方では
> char path1[PATH_LENGTH]; sprintf(path1,u8"sys/%02d.txt",1); int FH= FileRead_open(path1);
> のようになると思うのですが、utf-8もユニコードなので、なんでcharなのか分からず
ユニコード = wchar_t というわけではないからです
ユニコードにも色々ありまして、wchar_t のユニコードは utf-16le、utf-16be、
utf-32le、utf-32be のどれかで、処理系によって異なります
( Windowsでは utf-16le で、Android では utf-32le です )
なので、utf-16le を使用する場合は「文字セット」の項目を「Unicode 文字セットを使用する」に
設定して、それ以外を使用する場合は「マルチ バイト文字セットを使用する」を設定します
utf-8 は utf-16le ではないので、「マルチ バイト文字セットを使用する」を設定するわけです
> ↑のようにvisual studioの「文字セット」の項目を「マルチ バイト文字セットを使用する」にするともありますし
> ですがその場合例えばFileRead_open()に渡すのはWCHARになるので問題があります。
いえ、「マルチ バイト文字セットを使用する」の設定の場合は FileRead_open に渡すのは char です
> windows版を基本に、海外版にも対応可能な、かつandroidにも移植しやすくと考えたとき
> この辺りはどういう方法を取るのがベストなのでしょうか?
現在でしたら utf-8 を使用するのが良いかと思います
ただ、utf-8 を使用する場合は
https://dxlib.xsrv.jp/lecture/Android/Android_CharCode.html#R5
の説明の通り、WinMain の冒頭で SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); を
実行する必要がありますので注意してください m(_ _)m
あと、sprintf や fopen など標準関数を使用する場合は、#include <locale.h> を
追加の上で、やはり WinMain の冒頭で setlocale( LC_ALL, ".utf8" ); を実行する
必要があります( sprintf や fopen などの標準関数に渡す文字列が utf-8 である、
ということを設定しないとデフォルトのシフトJISの文字列として扱われてしまうため )
|
Re: windows版を基本に、androidにも移植しやすい環境について ( No.2 ) |
- 名前:たろう 日時:2020/08/20 00:52
いつもありがとうございます。
すみません、「FileRead_open()に渡すのはWCHARになる」の件は
頭の中でマルチバイトとユニコードが途中で逆になり変な事を書いていました。
念のため確認させていただきたいのですが、では上であげた例の記述としては
char path1[PATH_LENGTH]; sprintf(path1,u8"sys/%02d.txt",1); int FH= FileRead_open(path1);
が正解で、かつ、DxLib_Init の前に、SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 )
そして、#include <locale.h>追加の上でWinMain の冒頭 setlocale( LC_ALL, ".utf8" );
であっていますでしょうか?
その他に何か注意点がございましたら調べますので、ヒントなど教えていただけると助かります。
知識が足りずすみません、よろしくお願いいたします<(_ _)>
|
Re: windows版を基本に、androidにも移植しやすい環境について ( No.3 ) |
- 名前:管理人 日時:2020/08/20 01:10
> 念のため確認させていただきたいのですが、では上であげた例の記述としては
> char path1[PATH_LENGTH]; sprintf(path1,u8"sys/%02d.txt",1); int FH= FileRead_open(path1);
> が正解で、かつ、DxLib_Init の前に、SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 )
> そして、#include <locale.h>追加の上でWinMain の冒頭 setlocale( LC_ALL, ".utf8" );
> であっていますでしょうか?
はい、あっています
因みに SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ) も setlocale( LC_ALL, ".utf8" ); と
同様に WinMain の冒頭で実行した方がより良いです
( setlocale と SetUseCharCodeFormat はどちらが先でも問題ありません )
> その他に何か注意点がございましたら調べますので、ヒントなど教えていただけると助かります。
SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); と setlocale( LC_ALL, ".utf8" ); を
実行しても Win32 API に渡すべき文字列はシフトJISのままですので、
fopen の代わりに Win32 API である CreateFile など文字列を引数に渡す API を呼ぶ際は
注意してください( A〜Z 0〜9 などのアルファベットと数字と .,+-*/=~|[]!"#$%&'()_ などの
基本的な半角文字でしたら シフトJIS と utf-8 は共通なので、文字列を渡す Win32 API を
呼ぶ際は基本的に全角文字を使わないようにすると良いです( 因みに半角カタカナはNGです ) )
|
Re: windows版を基本に、androidにも移植しやすい環境について ( No.4 ) |
- 名前:たろう(解決) 日時:2020/08/20 01:35
いつもありがとうございます。
冒頭に実行の件、Win32 API関連の件など
情報をありがとうございます。
参考にさせていただきます
夜遅くにお手数をおかけいたしました
ありがとうございましたm(__)m
|
Re: windows版を基本に、androidにも移植しやすい環境について ( No.5 ) |
- 名前:たろう 日時:2020/09/01 23:50
たびたびすみません、解決済みにしたスレッドですが、
関連なのでここに引き続き質問させてくださいm(__)m
ttps://dxlib.xsrv.jp/lecture/Android/Android_CharCode.html#R5
↑のページには
「txtファイルなど外部のファイルからゲーム中に表示する文章データを読み込む場合は、それらの
txtファイルを作成した際に文字コードを『UTF-8』に変更する必要があります。」
とあるのですが、ANSIを選んで保存したテキストファイルでも、文字化けなく使えるようです
色々な文字を試しましたが、文字化けしませんでした。
これはつまり、SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 );を使うことで、
たとえANSIで保存したファイルであってもFileRead_getsなどDXライブラリの関数で読み込めば
自動でutf-8に変換されているという事でしょうか?
そうであれば他の形式のUnicodeで保存したテキストファイルなども変換されるのでしょうか?
お忙しい所すみません、よろしくお願いいたします
|
Re: windows版を基本に、androidにも移植しやすい環境について ( No.6 ) |
- 名前:管理人 日時:2020/09/02 00:44
> これはつまり、SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 );を使うことで、
> たとえANSIで保存したファイルであってもFileRead_getsなどDXライブラリの関数で読み込めば
> 自動でutf-8に変換されているという事でしょうか?
はい、その通りです
最近 txtファイルの文字コード形式を自動で検出する機能を追加したので、
ある程度はシフトJISなのか、UTF-8なのかを自動で判別するようになっています
ただ、Bom付きのUTF-8のtxtファイルであれば自動判別処理が確実に UTF-8 であると判断できるので、
txtファイルは Bom付きのUTF-8 をお勧めします m(_ _)m
|
Re: windows版を基本に、androidにも移植しやすい環境について ( No.7 ) |
- 名前:たろう(解決) 日時:2020/09/02 09:40
ファイルのプロパティからパスをコピペしてutf-8のテキストに保存→それを読みこんで使う
という様な事をしているのですが、パスのコピー時にうっかりはみ出して選択コピーすると
utf-8では表示されない謎の文字が文頭に付け加わって、パスが通らない事があったりします。
それがANSIだと文頭に「?」が表示されて判別できるので
判定精度の問題はあっても、自動で変換されるのはすごく助かります。
ありがとうございましたm(__)m
|