dxlib4dで可変長配列の文字列をprintfDxで表示したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
大白定義
記事: 14
登録日時: 14年前
住所: 三重県

dxlib4dで可変長配列の文字列をprintfDxで表示したい

#1

投稿記事 by 大白定義 » 13年前

現在、D言語とSquirrelとDXライブラリを使って何か作ろうと考えています。
そこで、まずSquirrel側のprint関数の結果をDXライブラリのprintfDx関数を使って表示させてみようと思い、下のようなコードを書きました。

コード:

import std.stdio;
import std.stdarg;
import std.string;
import std.conv;

import squirrel;
import sqstdio;
import sqstdaux;

import dxlib;

extern(C) void PrintFunc(HSQUIRRELVM sq, const(SQChar)* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    
    //vfprintf(core.stdc.stdio.stdout, fmt, args);
    char[512] buf;
    vsprintf(buf.ptr, fmt, args);
    auto str = to!wstring(buf);
    printfDx(str.ptr);
    
    va_end(args);
}

void main(){
	ChangeWindowMode(TRUE);
	if(DxLib_Init() == -1) return;
	
	HSQUIRRELVM sqvm = sq_open(1024);
	
	sqstd_seterrorhandlers(sqvm);
	
	sq_setprintfunc(sqvm, &PrintFunc, &PrintFunc);
	
	sq_pushroottable(sqvm);
	
	if(SQ_FAILED(
			sqstd_dofile(
				sqvm,
				".\\script\\test.nut",
				SQFalse,
				SQTrue)
			)
		)
	{
		printfDx("スクリプト見つからへんで");
	}

	sq_close(sqvm);
	
	WaitKey();
	
	DxLib_End();
}
これはコンパイルには成功するのですが、実行すると
std.utf.UTFException@std\utf.d(645): Invalid UTF-8 sequence (at index 1)
という例外が発生してしまいます。

どのように解決すればよいのでしょうか?
ご教示のほど、よろしくお願いします。

コンパイラはDMD2.0、
ライブラリはdxlib4dと、SquirrelをDにインポートしたものを利用しています。

コード:

printf("hoge");
       ↓

コード:

printf("hoge");

しひ

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#2

投稿記事 by しひ » 13年前

日本語を含んだソースコードをコンパイルする場合、ソースコードがUTF-8形式になっている必要があります。

しひ

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#3

投稿記事 by しひ » 13年前

ああ、コンパイルは成功しているんでしたね。
勘違いでした。

アバター
大白定義
記事: 14
登録日時: 14年前
住所: 三重県

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#4

投稿記事 by 大白定義 » 13年前

まず何かがおかしいと思ったら、printfDxに入れる引数を間違えていました。

そこでprintfunc関数を下のように書き換えました

コード:

extern(C) void PrintFunc(HSQUIRRELVM sq, const(SQChar)* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    
    //vfprintf(core.stdc.stdio.stdout, fmt, args);
    char[512] buf;
    vsprintf(buf.ptr, fmt, args);
    printfDx("%s", buf.ptr);
    
    va_end(args);
}
すると、実行時のエラー自体は解決しましたが、表示される文字列が文字化けしてしまいました。
printfDxをprintfに変更して実行すると文字化けしないようなのですが、これはDXライブラリがUTF-8に対応していないということなのでしょうか?

コード:

printf("hoge");
       ↓

コード:

printf("hoge");

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#5

投稿記事 by h2so5 » 13年前

DXライブラリの文字コードは通常だとShift-JIS, UnicodeモードだとUTF-16です。

アバター
大白定義
記事: 14
登録日時: 14年前
住所: 三重県

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#6

投稿記事 by 大白定義 » 13年前

h2so5さん、ありがとうございます。

UTF-16に変換するべく、std.utf.toUTFzで変換できないか試みてみましたが、するとまた
std.utf.UTFException@std\utf.d(645): Invalid UTF-8 sequence (at index 1)
というエラーが発生してしまいました。

ためしにprintfDx("テスト");として動くかどうかも試してみた所、問題なく表示されたので、dファイルそのものの文字コードが違う、ということも無いようです。

コード:

printf("hoge");
       ↓

コード:

printf("hoge");

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#7

投稿記事 by ISLe » 13年前

SQCharってのはANSI文字列なんですかね。
vsprintfに書式文字列としてそのまま渡せる文字列なんでしょうか。

printfなら表示されるとありますけど、D言語のprintfということですかね。
そうするとvsprintfもD言語でUTF-8を扱うということですかね。

bufの内容を1バイトずつ16進数で表示してみたら何か分かる気がしますけど。

しひ

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#8

投稿記事 by しひ » 13年前

例外が出るのは、bufの空きが255で埋められているのが原因のようです。
char[512] buf = 0;として0で埋めた後、printfDx("%s", buf.toUTF16.ptr);として下さい。

それと、ファイルの形式はUTF-8, 16, 32のどれかであれば良かったみたいです。

アバター
大白定義
記事: 14
登録日時: 14年前
住所: 三重県

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#9

投稿記事 by 大白定義 » 13年前

>ISLeさん
基本的にD言語の標準ライブラリはC言語のものをラップする感じで作られているはずなので、C言語のprintf=D言語のprintfでいいと思います。

>しひさん
仰るとおりにやってみたところ、正常に動作しました!
ありがとうございます!

コード:

printf("hoge");
       ↓

コード:

printf("hoge");

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#10

投稿記事 by ISLe » 13年前

未確認ですが、buf.toUTF16z.ptrにすると0で埋めなくても済むのではないでしょうか。
文法的に間違ってたらすみません。

アバター
大白定義
記事: 14
登録日時: 14年前
住所: 三重県

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#11

投稿記事 by 大白定義 » 13年前

いえ、確認してみたところ、bufを0で埋めておかないとエラーが発生しました。
0で埋めるのは必須のようです。

コード:

printf("hoge");
       ↓

コード:

printf("hoge");

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#12

投稿記事 by ISLe » 13年前

buf.toUTF16.ptr

buf.toUTF16z.ptr
に変えたら終端文字までしか処理しないようになると思ったのですが。
z付きってそういう意味じゃなかったんですかね。

しひ

Re: dxlib4dで可変長配列の文字列をprintfDxで表示したい

#13

投稿記事 by しひ » 13年前

toUTF16とtoUTF16zの違いは、返される文字列の最後に終端文字が付くかどうかの違いです。
元々、D言語の文字列に終端文字は存在しないのでそのような区別は必要ないのですが、
C言語の関数を呼び出すときは最後に0を付加してやる必要があるので区別されています。

閉鎖

“C言語何でも質問掲示板” へ戻る