2012-06-21 13 views

回答

1

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

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

+0

yes.but NDK可能没有实现这个函数,所以我想实现一个像swprintf这样的函数。 – nightday

+0

如果NDK不提供它,我建议使用一个库提供类似的功能,如Glib(来自http://gtk.org/ ...) –

+0

glib使用三重奏为g_snprintf函数,但三重奏只提供了字符,不支持宽字符, – nightday

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); 

解决方法是使用的任一项所述的wchar_t的字符串为UTF-8(它是一个char *)转换开源宽到UTF8实现(例如the UTF8-CPP project),传递其指针的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;如果操作系统版本低于5.0,则返回false。