在函数中传递 string 或 wstring

Tom*_*Tom 0 c++

我想简化代码以对 ANSI 和 UNICODE 字符串版本使用相同的函数

tstring formatW(const std::string format, ...);
tstring formatA(const std::wstring format, ...);
Run Code Online (Sandbox Code Playgroud)

在单个参数化函数中

tstring format(const tstring format, ...);
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用它,我会在第 3 行收到错误

  const std::string fmtA =  "MouseWheel nFlags %u,zDelta %d, CPoint(%d,%d";
  std::string strA  = formatA(fmtA, nFlags, zDelta, pt.x, pt.y );   // Ok
  std::string strA2 = format (fmtA, nFlags, zDelta, pt.x, pt.y );   // Fail :(

  const std::wstring fmtW = L"MouseWheel nFlags %u,zDelta %d, CPoint(%d,%d";
  std::wstring strW  = formatW(fmtW, nFlags, zDelta, pt.x, pt.y);  // Ok
  std::wstring strW2 = format (fmtW, nFlags, zDelta, pt.x, pt.y);  // Fail
Run Code Online (Sandbox Code Playgroud)

我得到的错误是这样的:

错误 C2664: ~tstring Format(const tstring,..'.)': 无法将参数 1 从 'const std::string' 转换为 'const tstring'

我对参数化函数不熟悉。

Mic*_*kis 5

charwchar_t(string/wstring 的底层类型)不兼容(8 位和 16 位),因此您无法在运行时检查环境中组合它们。

这就是为什么 Windows 对于许多功能有 2 个版本(MessageBoxA、MessageBoxW 等)。

解决方案:使用一个将数据存储为 UTF-8(char)的类,然后在需要 wchar_t 时将其转换为 16 位。或者更好,反之亦然(内部使用 wchar_t 并在需要 char* 时将数据转换为 UTF-8)。

  • @tom:*“UTF-8 Everywhere”*运动是教条主义的,而不是务实的。它未能解决一个最重要的方面:字符编码仅在信息**交换**中起作用,即当数据进入或离开应用程序时(例如写入文件、通过套接字发送数据等)。在您的应用程序中,您可以(并且可能应该)使用 UTF-16LE,Windows 的本机字符编码,编码为“wchar_t”。“UTF-8 无处不在”运动也未能承认 UTF-16 无处不在(Windows、Java、.Net 等)。 (2认同)