トップページ > 記事閲覧
月並みな質問ですが文字コードについて2
名前:匿名 日時: 2022/01/27 14:50

質問の仕方が悪くてうまく伝わっていないようなので、形を変えて再質問します。 前回: 月並みな質問ですが文字コードについて ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=5269 DXライブラリとは全く無関係のライブラリ関数 char *foo() があります(そのライブラリは有名)。もちろん実際には異なる名前です。 fooはutf8で書かれたファイルの或る一行を読み込みます。実際、ネットで拾ってきたutf8を変換するサンプル(MultiByteToWideCharを使う)とwchar_tという型になりMessageBoxWで表示できます。そうしなければ文字化けします。 foo()は或るメモリブロックの先頭アドレスを返しそのブロックにはutf8で書かれた文字列であり終端は0x00でしょう。MessageBoxW関数は int MessageBoxW( [in, optional] HWND hWnd, [in, optional] LPCWSTR lpText, [in, optional] LPCWSTR lpCaption, [in] UINT uType ); からLPCWSTR型に変換する必要があります。 私の或る環境の場合はLPCWSTRとwchar_tが同じに様です。 CやC++のポインタはハッキリ言って単にアドレスだから、そのアドレスが指すメモリの内容が何かどうかプログラマ任せです。何でもvoid*に変換できるし。取り敢えずバイト列ということでchar*にしてあるのでしょう。 宣言 int LoadGraph( char *FileName ) ; のアドレスFileNameが端末0x00の文字列だとして、そのエンコード方法が何かは私には分かりません。試しに GraphHandle = LoadGraph( foo() ) ; とすると、日本語を含む場合には失敗します。 どうやったら成功するのでしょうか。 前回の質問にありますが、 DrawString(foo()) は成功します。変換していません。 >u8"Test String" のようにする とは、ソースがSJISで書かれているとして、 void *p=u8"日本語" は(コンパイルに成功したとして)コンパイラがソースコードの二重引用符で囲まれたSJIS文字列をutf8でエンコードして最後に0x00を付けたメモリブロックを用意して、その先頭アドレスをpに入れる意味であって、変換はコンパイラが行います。 それが私の解釈であって、今回は使えないようです。
メンテ

Page: 1 |

Re: 月並みな質問ですが文字コードについて2 ( No.1 )
名前:管理人 日時:2022/01/28 02:24

状況を正確に把握したいと思いますので 『DXライブラリとは全く無関係のライブラリ』と 『DXライブラリとは全く無関係のライブラリの関数』 の名称を教えて頂けないでしょうか? また、匿名さんが試された 『DrawString(foo()) は成功するけど LoadGraph(foo()) は失敗する』プログラム をこちらの掲示板に貼り付けていただけないでしょうか? m(_ _)m ( 実際に手元で試してその状況を確認できれば原因も分かり、正確なご返答もできると思いますので… )
メンテ
Re: 月並みな質問ですが文字コードについて2 ( No.2 )
名前:匿名 日時:2022/01/30 02:08

ttp://ash.jp/code/unitbl21.htm を見ると"日本"は ●JIS第一水準漢字・文字コード表 区 点 JIS SJIS EUC UTF-8 UTF-16 字 38 92 467C 93FA C6FC E697A5 65E5 日 43 60 4B5C 967B CBDC E69CAC 672C 本 です。 実際に、私が使っているテキストエディタで夫々のコーディングで保存してダンプすると utf8の場合 E6,97,A5,E6,9C,AC,20,0A sjisの場合 93,FA,96,7B,20,0A となります。"20,0A"は空白文字と改行です。utf8でもSJISでも所謂半角文字は同じになります。 余り言いたくないのですが、 >『DXライブラリとは全く無関係のライブラリ』と >『DXライブラリとは全く無関係のライブラリの関数』 は Lua(ttps://ja.wikipedia.org/wiki/Lua) lua_tostring() です。 元来、DXライブラリと組み合わせて使うものではないのは承知しています。便利だから使っているだけです。 なお私はLua信者ではありません。 言及しなかったのは、重複しますが、Luaとは直接関係ないからです。 実際のバインディングは次です。 int myLoadGraphScreen(lua_State *L) { int x = lua_tointeger(L, 1); int y = lua_tointeger(L, 2); const char *GraphName = lua_tostring(L, 3); /* EANS1246 TODO */ printf("%02X,", GraphName[0]); printf("%02X,", GraphName[1]); printf("%02X,", GraphName[2]); printf("%02X,", GraphName[3]); printf("%02X,", GraphName[4]); printf("%02X,", GraphName[5]); printf("%02X,", GraphName[6]); Sleep(10 * 1000); abort(); int TransFlag = lua_tointeger(L, 4); int ret = LoadGraphScreen(x, y, GraphName, TransFlag); lua_pushinteger(L, ret); return 1; } もちろん登録用処理もあるが割愛。 printfからabortまでは、今回だけのデバッグ用です。それは <Luaソース>(utf8で書かれる) LoadGraphScreen( 0 , 0 , "日本" , 0 ) ; が評価されると、次を出力します。 FFFFFFE6,FFFFFF97,FFFFFFA5,FFFFFFE6,FFFFFF9C,FFFFFFAC,00, "FFFFFFE6"はE6です。先頭ビットが立っていてlua_tostring()がconst char *だから%02Xだとこうなります。 つまり、Luaは無関係です。 LoadGraphScreen(x, y, GraphName, TransFlag); の第三引数のアドレスGraphNameが指す先に E6,97,A5,E6,9C,AC,00 がある場合にファイル名"日本"をLoadGraphScreen()が読み込めない、ということです。 もちろん実際には".bmp"等の画像を示す拡張子を付けます。 話は簡単で、バイト列E6,97,A5,E6,9C,ACをLoadGraphScreen()が期待するコーディングに変換すればいいんです。 それが私には出来ない、ということです。 単に文字コードに関する知識が足りないだけで、LuaとかDXライブラリとは直接の関連はありません。 DrawString()も同じです。 int myDrawString(lua_State *L) { int x = lua_tointeger(L, 1); int y = lua_tointeger(L, 2); const char *String = lua_tostring(L, 3); /* EANS1246 TODO */ int Color = lua_tointeger(L, 4); /* unsigned int */ int ret = DrawString(x, y, String, Color); lua_pushinteger(L, ret); return 1; } こちらは成功します。 最初は失敗していたが、ネット情報を参考にして成功させました。 その手順は忘れました。
メンテ
Re: 月並みな質問ですが文字コードについて2 ( No.3 )
名前:tk-xleader 日時:2022/01/30 20:47

横から失礼。 前回の質問の回答にもありますが、DxLib_Init()を呼び出す前に、SetUseCharCodeFormat関数を、引数としてDX_CHARCODEFORMAT_UTF8を渡して呼び出せば、DXライブラリ内で使われる文字コードがutf-8に変わります。 そうじゃなくて、設定ファイルだけutf-8にした上で、内部で使う文字コードはデフォルト(日本語版ならShift-JIS)のままで扱いたいということでしょうか? それなら、一旦MultiByteToWideCharでwchar_t文字列に変換して、Windows APIのWideCharToMultiByte関数(ref: ttps://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-widechartomultibyte)を使い、第1引数にCP_ACPを指定して呼び出せば多分やりたいことができると思います。 それで、おそらくなんですが、DrawStringが成功するのは、luaスクリプトの文字コードがShift-JISになっているからとかではないでしょうか?
メンテ
Re: 月並みな質問ですが文字コードについて2 ( No.4 )
名前:管理人 日時:2022/01/30 21:38

> 話は簡単で、バイト列E6,97,A5,E6,9C,ACをLoadGraphScreen()が期待するコーディングに変換すればいいんです。 > それが私には出来ない、ということです。 tk-xleaderさんも仰られていますが、DxLib_Init() を実行する前の行に SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); を加えることで、『LoadGraphScreen()が期待するコーディング』を utf8 にすることができ、 変換することなく lua_tostring の戻り値をそのまま LoadGraphScreen に渡すことができるようになりますので、 よろしければお試しください
メンテ
Re: 月並みな質問ですが文字コードについて2 ( No.5 )
名前:匿名 日時:2022/02/01 15:22

解決しました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存