l使用ANDROID NDK .so我想格式化一些东西。只要使用sprintf,但是l不能与 wchar_t一起使用。有没有对我有帮助?如何实现函数sprintf使用wchar参数?
0
A
回答
1
你可能想要swprintf和朋友,假设Android有它像Posix和Linux系统。
Glib(来自GTK)具有unicode manipulation和string utilities的功能。我相信你应该能够使它在Android上工作。
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。
相关问题
- 1. 如何使用WCHAR * out参数从C#调用C函数?
- 2. 如何将可变数量的参数传递给sprintf()函数?
- 3. 在gnuplot中使用sprintf函数中的两个参数
- 4. 如何用params关键字读取参数并实现函数
- 5. C编译器如何使用可变数量的参数实现函数?
- 6. 使用参数调用泛型函数的实现超时
- 7. 使用可变参数为的sprintf
- 8. sprintf的使用参数的动态量
- 9. 如何实现“appendFile”函数?
- 10. 如何实现isRePin()函数
- 11. 如何实现haskell`\\`函数?
- 12. 如何实现typeOf函数?
- 13. 构造函数参数值未实现
- 14. 实现参数很长的Bitset函数
- 15. PHP,Printf,Sprintf函数
- 16. sprintf()函数,为什么使用它?
- 17. C sprintf函数,使用malloc或堆栈
- 18. 使用协议中定义的默认参数实现函数
- 19. Kotlin VS Scala:使用主构造函数参数实现方法
- 20. 在构造函数中使用参数实现控制器
- 21. 魔术sprintf函数 - 如何包装它?
- 22. 如何在参数化函数中实现NSTimer?
- 23. 如何在Java中实现函数参数的元组解包?
- 24. 如何实现rundll2可调用函数?
- 25. 如何在函数式编程中实现带隐藏参数的函数?
- 26. 你将如何实现除数函数?
- 27. 我如何实际使用Vim函数的参数值?
- 28. 自动使用C++字符串函数sprintf函数的替代
- 29. 如何使用函数的参数PHP
- 30. 如何使用泛型函数参数
yes.but NDK可能没有实现这个函数,所以我想实现一个像swprintf这样的函数。 – nightday
如果NDK不提供它,我建议使用一个库提供类似的功能,如Glib(来自http://gtk.org/ ...) –
glib使用三重奏为g_snprintf函数,但三重奏只提供了字符,不支持宽字符, – nightday