如何实现功能的工作作为sprintf的使用WCHAR的参数?(how implement funct

2019-10-29 03:48发布

1中所用ANDROID NDK。所以升要格式化something.just用sprintf,但升不与wchar_t的使用它。 是有一些帮助我吗?

Answer 1:

你可能想的swprintf和朋友,假设Android有它像POSIX和Linux系统。

油嘴(从GTK )有功能的Unicode管理和字符串工具 。 我相信你应该能够使它在Android上工作。



Answer 2:

在Android操作系统NDK版本5.0前( “棒棒糖”),sprintf的()不支持 “%LS”(wchar_t的指针)的格式说明。 因此,下面的语句编译但不NDK下正确执行(预5.0):

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

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

解决方法是使用开放源码的宽到UTF8实现的任何一个(例如将wchar_t字符串UTF8(这是一个char *)转换的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(“棒棒糖”)开始,sprintf的()支持“%1!”格式说明,所以上述原始的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,而返回false如果OS是预5.0。



文章来源: how implement function work as sprintf use wchar for parameter?
标签: printf wchar