0

l used ANDROID NDK 。so l want to format something。just use sprintf,but l can not use it with wchar_t. is there some helps for me?</p>

4

2 に答える 2

1

5.0 ("Lollipop") より前の Android OS NDK バージョンでは、sprintf() は "%ls" (wchar_t ポインター) 形式指定子をサポートしていません。したがって、次のステートメントはコンパイルされますが、NDK (5.0 より前) では正しく実行されません。

char buffer [1000];
wchar_t *wp = L"wide-char text";

sprintf (buffer, "My string is: %ls", wp);

回避策は、wchar_t 文字列を UTF-8 (char *) に変換することです。これには、オープン ソースの wide-to-utf8 実装 (例: UTF8-CPP プロジェクト) のいずれかを使用し、そのポインターを sprintf に渡します。

// WcharToUtf8: A cross-platform function I use for converting wchar_t string
//              to UTF-8, based on the UTF8-CPP Open Source project
bool WcharToUtf8 (std::string &dest, const wchar_t *src, size_t srcSize)
{
    bool ret = true;

    dest.clear ();

    size_t wideSize = sizeof (wchar_t);

    if (wideSize == 2)
    {
        utf8::utf16to8 (src, src + srcSize, back_inserter (dest));
    }
    else if (wideSize == 4)
    {
        utf8::utf32to8 (src, src + srcSize, back_inserter (dest));
    }
    else
    {
        // sizeof (wchar_t) is not 2 or 4 (does it equal one?)!  We didn't 
        // expect this and need to write code to handle the case.
        ret = false;
    }

    return ret;
}
...
char buffer [1000];
wchar_t wp = L"wide-char text";
std::string utf8;

WcharToUtf8 (utf8, wp, wcslen (wp));
sprintf (buffer, "My string is: %s", utf8.c_str ());

Android 5.0 ("Lollipop") 以降、sprintf() は "%ls" 形式指定子をサポートするため、上記の元の sprintf() コードは正しく機能します。

Android NDK コードを Android のすべてのバージョンで実行する必要がある場合は、sprintf に渡されるすべての wchar_t ポインターを次のようなマクロでラップする必要があります。

#define CONVERTFORANDROID(e) (GetSupportsSprintfWideChar () ? (void *) e : (void *) WcharToUtf8(e).c_str ())

char buffer [1000];
wchar_t *wp = L"wide-char text";

sprintf (buffer, "My string is: %ls", CONVERTFORANDROID(wp));

GetSupportsSprintfWideChar() 関数は、実行中の Android OS が 5.0 以降の場合は true を返し、OS が 5.0 より前の場合は false を返すローカル関数である必要があります。

于 2014-10-23T03:11:54.900 に答える
1

Android に Posix や Linux システムのような機能があると仮定すると、おそらくswprintfとその仲間が必要になるでしょう。

Glib ( GTKから) には、Unicode 操作文字列ユーティリティの関数があります。Androidで動作させることができるはずだと思います。

于 2012-06-21T11:10:18.270 に答える