#memo

indiedev太郎

FStringから文字コード取得

4.11で関数ライブラリをC++からつくるとき、公式ドキュメント含めネットで確認できるものと微妙に挙動がかわっている
GENERATED_UCLASS_BODY()じゃなくてGENERATED_BODY()をつかえばコンパイルがとおって、前者だとだめ。デフォルトだと後者が生成されるのでいいのだけれど、この辺りの変更ってどっかでわかるのだろうか

フォント周りを作っていて、文字コードみるのが必要になったりならなかったりなので、UTF8で取得できるものをつくる

void UMyBlueprintFunctionLibrary::GetCharacterCode(const FString input, FString& out)
{
	char* c = TCHAR_TO_UTF8(*input);
	int32 code = static_cast<int32>(static_cast<unsigned char>(*c));

	if (code == 227)
	{
		// 227ならひらがななので3byte分出力
		FString str, tmp;
		toHexString(static_cast<int32>(static_cast<unsigned char>(*c)), false, tmp);
		str += tmp;
		toHexString(static_cast<int32>(static_cast<unsigned char>(*(c+1))), false, tmp);
		str += tmp;
		toHexString(static_cast<int32>(static_cast<unsigned char>(*(c+2))), false, tmp);
		str += tmp;

		out = str;
	}
	else
	{
		out = FString::FromInt(code);
	}
	
}

void UMyBlueprintFunctionLibrary::toHexString(int32 val, const bool lower, FString& out)
{
	if (!val)
	{
		out = FString(TEXT("0"));
	}
	else
	{
		FString str;
		const char hc = lower ? 'a' : 'A';

		while (val != 0) {
			int32 d = val & 15;
			if (d < 10)
				str.InsertAt(0, d + '0');
			else //  10以上の場合
				str.InsertAt(0, d - 10 + hc);
			val >>= 4;
		}
		out = str;
	}
}

UTF-8は半角英語以外は3バイトでかえってきて、そのバイト数の確認がいまいちよくわからなかった。UTF-8だとひらがなの先頭バイトが227(16進数でE3)なので、野性的なifを使用して16進数で返している、switchとかに投げるなら別にそのままでいいきがする