如何在 windows 和 linux 上使用相同的宽字符字符串格式

Posted

技术标签:

【中文标题】如何在 windows 和 linux 上使用相同的宽字符字符串格式【英文标题】:How to use same wide char string format for windows and linux 【发布时间】:2015-03-24 11:56:59 【问题描述】:

目前,我有一些可以在 Windows/Linux 上运行的代码。现在输出一些信息时出现问题。 在 Windows 上,我使用 _vsnwprintf_s() 来支持可变参数。所以它支持以下格式。

Log0(L"111");
Log1(L"%s", L"22");
Log2(L"%s, %d", L"33", 44);

在 Linux 上,我不能使用 vswprintf 来格式化字符串,但它需要使用 %ls 来格式化宽字符串。

Debug0(L"111");
Debug1(L"%ls", L"22");

目前,我想封装一个统一的函数 InfoX() 以支持跨平台,因此它内部将根据当前操作系统类型使用 LogX() 或 DebugX()。 如您所见,在 Windows 上,我将使用 %s 来格式化宽字符串,但在 linux 上将使用 %ls。我不知道如何在 Info2() 函数中的 ??? 处输入。

Info2(L"???", L"22");

【问题讨论】:

您是使用 C++ 编译器还是 C 编译器编译代码?我认为您应该指定 c++ 标签或 c 标签,而不是两者。 我用的是g++,我会更新tag。 你不是说swprintf吗?你没有传递va_list 根据Microsoft,%ls 说明符需要一个宽字符字符串:“lslSwswS 类型说明符与 @987654333 同义@ 在 printf 函数中,swprintf 函数中。"所以你可以在 Linux 和 Windows 上使用%ls。 (%S 的格式似乎是非标准的,在两个平台上都不一样。) 【参考方案1】:

你为什么不使用 stl 库?它是回答您的问题的更好工具。 您使用宽字符,因此 std::wstring 是最佳解决方案。 要创建您的“wstring”值,您可以使用“wstringstream”并且您不需要格式化您的字符。

#include <sstream>
#include <iostream>

void LOG(std::wstring _sLog)

    std::wcout << _sLog << '\n';
    //Your LOG code


int main()


    std::wstringstream oss;
    std::wstring wideValue(L"my wide value :");
    oss << wideValue << 101;
    std::wstring s = oss.str();
    LOG(s);

    return 0;

【讨论】:

以上是关于如何在 windows 和 linux 上使用相同的宽字符字符串格式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 windows 和 linux 上使用相同的宽字符字符串格式

如何在带有 Tortoise git 的 Windows 上使用 linux 生成的密钥?

在 Linux 上显示当前分支和着色(如 Windows 上的 Git Bash)

Webfonts 在 Windows、Mac 和 Linux 上呈现不同

GWT 应用程序在 Windows 上运行,而不是在具有相同配置的 Linux 上运行

编译 C++ 代码以在 Windows 和 Linux 中表现相同 [关闭]