【问题标题】:How to convert char/* to wchar_t/* ---but如何将 char/* 转换为 wchar_t/* ---但是
【发布时间】:2012-06-07 21:31:12
【问题描述】:

我正在将(相当)旧的 C 代码转换为 VS2010。当我使用多字节选项编译程序时一切正常,但我必须将其转换为 UNICODE。

我收到很多与字符串对话相关的错误消息(但这并不奇怪)。 我的问题与我必须使用 wchar 字符串(因为 UNICODE)但我还必须保留标准 char 值(程序需要使用标准 ascii 代码将数据写入文件)这一事实有关。

更清楚地说,使用 Windows 需要 UNICODE,但文件必须保存为 ascii 格式。我在很多地方都收到了错误,这就是我决定把这个问题放在这里的原因。

somoene 能否建议解决此类问题的最佳做法?

提前谢谢你!

编辑:

好吧,我不是 C/C++ 专家,这是我的第一个大型项目。我已经从第一个答案中尝试了您的建议,如下所示:}

    { 
TCHAR* strz1=_T("%u blocks converted.");
      if (n>0) 
      {
      sprintf(str,strz1,n)
      }
      else
      TCHAR* strz2=_T("No blocks found!"); 
      sprintf(str,strz2);
      TCHAR* strz3=_T("Status");
      MessageBoxW(hwnd,str,strz3,MB_OK|MB_ICONINFORMATION);
      return(fe);
    }

我遇到了著名的错误:

错误 C2664:“sprintf”:无法将参数 2 从“TCHAR *”转换为“const char *”

错误 C2664:“MessageBoxW”:无法将参数 2 从“char [32]”转换为“LPCWSTR”

【问题讨论】:

  • 您的方案的最佳实践(“我有错误。我不会告诉你它们是什么”)是解决问题。我不会告诉你怎么做的。
  • 使用UNICODE,但在MessageBoxA 中调用需要使用ASCII 的函数,而不是MessageBoxWMessageBox。使用WideCharToMultiByte 转换字符串。不过,我不确定这一切是否都没有示例。
  • 那么你的问题是如何在ASCII和Unicode之间进行转换?你试过谷歌搜索吗?
  • 一些事情:首先,您的else 应该立即跟随您的if(您可能需要大括号)。其次,您应该使用_vsprintfTCHAR 的任何名称。第三,为了显式使用MessageBoxW,您应该使用MultiByteToWideChar 之类的东西将参数转换为宽字符串。
  • 克里斯.. 我知道如果/ELSE,这不是问题。但是,你能告诉我用什么命令代替 sprintf 吗?

标签: c++


【解决方案1】:

如果您使用的是 MFC,请检查以下 CString 转换宏:ATL and MFC String Conversion Macros.

这样您可以使用 UTF-8 导出文件并将它们从 UTF-8 读取回 UTF-16,这是存储 wchar_s 的自然方式。这样,您的应用程序可以使用 UNICODE 并仍以 ASCII 格式导出(UTF-8 向后兼容 ASCII)。

【讨论】:

    猜你喜欢
    • 2018-01-07
    • 2011-03-14
    • 2021-01-29
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多