2

C で Adob​​e 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」の代わりに私の関数では、画像の一部や間違った変数を出力しようとするなど、さまざまな奇妙な文字(毎回異なる)を取得しています。

どんな助けでも大歓迎です。

4

2 に答える 2

2

Mac OS Xは通常、単純なchar *文字列がUTF-8であることを想定しているため、表示したコードで正しい結果が得られるはずです。

sprintf(buffer, "%s", (char*)str);

次のようなコードが有効なUTF-8文字列を示す数値を出力する場合:

if( FRE_OK == FREGetObjectAsUTF8(argv[0], &len, &str) ) {
    for(int i=0; i<len; ++i)
        printf("0x%02X ", str[i]);

    FREObject result;
    FRENewObjectFromUTF8(len, str, &result);
}

また、printfループを独自の関数の呼び出しに置き換えると、ガベージが発生します。

if( FRE_OK == FREGetObjectAsUTF8(argv[0], &len, &str) ) {
    executeCommand( (const char*)str );

    FREObject result;
    FRENewObjectFromUTF8(len, str, &result);
}

executeCommand()に問題がある可能性があります。

于 2012-04-29T07:29:39.190 に答える
1

単純なsignedcharを期待する関数にutf8文字列を渡すにはどうすればよいですか?

それを行う2つの方法:

  1. constchar*にキャストするだけです。utf8文字列はconstchar文字列と「互換性があり」、ASCIIのみのC文字列はASCII文字のみを含むutf8文字列と同一であり、非ASCII文字を含むutf8文字列は中央にゼロを含みません。ただし、この方法を使用すると、ASCIIの一部ではない文字は、読み取り不可能な文字列になります。もちろん、C関数がファイルを開くためのファイルパスのようなものを期待している場合、これは機能しません。
  2. OS固有のテキスト関数を使用して、コードページを変更し、utf8-stringをシステムが使用している8ビットコードページに再エンコードできるようにします。ただし、この方法を使用すると、システムコードページの一部ではない文字は「失われ」、「?」のような「デフォルト」の文字に変わります。または「正方形の疑問符」。したがって、「片仮名を調べる」のようなものは、「???を調べる」になります。または、OS関数の代わりに、libiconvのようなものを使用してみることができますが、これでは「コードページにない文字」の問題は修正されません。
于 2012-04-29T07:22:33.353 に答える