如何实现函数作为sprintf使用wchar参数?

时间:2012-06-21 11:07:19

标签: printf wchar

我使用了ANDROID NDK。所以我想格式化一些东西。只是使用sprintf,但我不能用它 wchar_t的。对我有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

你可能想要swprintf和朋友,假设Android有它像Posix和Linux系统一样。

Glib(来自GTK)具有unicode manipulationstring utilities的功能。我相信你应该能够在Android上运行它。

答案 1 :(得分:0)

在5.0之前的Android OS NDK版本中(" Lollipop"),sprintf()不支持"%ls" (wchar_t指针)格式说明符。因此,以下语句编译但在NDK(5.0之前)下无法正确执行:

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

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

解决方法是使用任何一个Open Source wide-to-utf8实现(例如the UTF8-CPP project)将wchar_t字符串转换为UTF-8(这是一个char *),并将其指针传递给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;如果操作系统是5.0之前,则返回false。