是否有任何函数可用于计算wchar_t的格式化字符串大小,类似于char(snprintf)?
msvc有snwprintf,但我找不到mac中的等价物。
如果没有办法用std库计算(没有提升)
答案 0 :(得分:0)
我使用Cubbi推荐的swprintf()函数在OSX(Apple LLVM版本8.0.0,clang-800.0.42.1)和CentOS(g ++ 4.8.5 20150623 Red Hat 4.8.5-11)上尝试过这个。
注意Mac上swprintf()的man条目表示其返回值是“写入的字符数”,而不是wchars的数量。
我运行了以下代码,并在每个平台的评论中显示了输出结果:
#include <iostream>
#include <clocale>
#include <string>
#include <cstring>
int main()
{
std::setlocale(LC_ALL, "en_US.utf8");
char narrow_str[] = "z\u00df\u6c34\U0001f34c";
std::cout << narrow_str << std::endl; // zß水
std::cout << strlen(narrow_str) << std::endl; // 10 (= 1 + 2 + 3 + 4)
std::wstring wide_str = L"z\u00df\u6c34\U0001f34c";
std::cout << wide_str.length() << std::endl; // 4
std::cout << wcslen(wide_str.c_str()) << std::endl; // 4
wchar_t warr[100];
int n1 = std::swprintf(warr, sizeof warr/sizeof *warr, L"%s", narrow_str);
int n2 = std::swprintf(warr, sizeof warr/sizeof *warr, L"Converted from UTF-8: '%s'", narrow_str);
std::cout << n1 << std::endl; // 10 with LLVM, 4 with gcc
std::cout << n2 << std::endl; // 34 with LLVM, 28 with gcc
}
从这看来,对于LLVM,(1)cppreference处的原始代码失败并返回-1,因为warr []数组太小,(2)swprintf()的返回值是以char。衡量。
这可能会,也可能不会有所帮助。