C で Adobe AIR のネイティブ拡張を作成しています。コードは後で他のプラットフォームに移植する必要があります。C側の私の関数では、このように空気から文字列を取得しています
uint32_t len;
const uint8_t * str = 0;
if( FRE_OK == FREGetObjectAsUTF8(argv[0], &len, &str) )
{
//Here i need to pass a string as an argument to other function
printf("Got string %s", str); //Showing weird letters instead of str
}
FREGetObjectAsUTF8 は、const uint8_t として表す必要がある UTF8 でエンコードされた文字列を返します。私は MacOS と XCode で作業しており、uint8_t は unsigned char として定義されています。問題は、単純な char* を引数として期待する一連の C コードにあります。ユニコードの文字は必要ありません。ラテン文字と数字のみを使用しています。
運の悪いタイプをキャストしようとしました。例として
char buffer[512];
sprintf(buffer, "%s", (char*)str); //Same weird letters here
しかし、文字列を反復すると、正しい値が得られます
for(i=0; i<len; i++)
printf("%s", str[i]); // Normal value
ですから、質問は次のとおりです。単純な符号付き文字を期待する関数に utf8 文字列を渡すにはどうすればよいですか? 実際、C++ で関数を作成し、「extern」で C 部分を使用することもできますが、純粋な C ソリューションの方が望ましいでしょう。
空気から文字列「initapp」を渡しています。それをランタイムに戻すと、正しい値「initapp」が表示されます。私のCコードでは、引数としてchar *を期待する関数に渡そうとしています
FREObject initApp(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
uint32_t len;
const uint8_t * str = 0;
if( FRE_OK == FREGetObjectAsUTF8(argv[0], &len, &str) )
{
/*
I have about 40 functions and most of them working with ASCII strings
*/
executeCommand( (const char*)str );
FREObject result;
FRENewObjectFromUTF8(len, str, &result);
return result; //It's ok. Correct string
}
return NULL;
}
しかし、「initapp」の代わりに私の関数では、画像の一部や間違った変数を出力しようとするなど、さまざまな奇妙な文字(毎回異なる)を取得しています。
どんな助けでも大歓迎です。