用于wchar_t的snprintf等效计算格式化字符串大小(mac)

时间:2017-04-26 01:56:59

标签: c++ xcode c++11

是否有任何函数可用于计算wchar_t的格式化字符串大小,类似于char(snprintf)?

msvc有snwprintf,但我找不到mac中的等价物。

如果没有办法用std库计算(没有提升)

1 个答案:

答案 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。衡量。

这可能会,也可能不会有所帮助。