【问题标题】:Automatically change between std::string and std::wstring according to unicode setting in MSVC++?根据 MSVC++ 中的 unicode 设置在 std::string 和 std::wstring 之间自动切换?
【发布时间】:2011-09-02 05:30:48
【问题描述】:

我正在编写一个 DLL,并希望能够在 MSVC++2010 中的 unicode 和多字节设置之间切换。例如,我使用 _T("string")LPCTSTRWIN32_FIND_DATA 而不是 -W 和 -A 版本等等。

现在我想让 std::strings 根据 unicode 设置在 std::stringstd::wstring 之间变化。那可能吗?否则,这最终可能会变得非常复杂。

【问题讨论】:

标签: c++ string unicode unicode-string


【解决方案1】:

为什么不像 Win32 API 那样做:在内部使用宽字符,并提供 DoSomethingA 函数的字符转换外观,这些函数只是将输入转换为 Unicode。

也就是说,您可以像这样定义 tstring 类型:

#ifdef _UNICODE
typedef std::wstring tstring;
#else
typedef std::string tstring;
#endif

或者可能:

typedef std::basic_string<TCHAR> tstring;

【讨论】:

  • 请注意,您也希望对 iostream 类型执行相同的操作;例如而不是使用std::fstream,而是为std::basic_fstream&lt;TCHAR&gt;创建一个typedef并使用它。
  • @Felix :没有所谓的“狭义”BSTR——根据定义,BSTR 始终是 UTF-16。
  • BSTR 在 Windows 上始终为 16 位:msdn.microsoft.com/en-us/library/ms221069.aspx
  • 如果您只使用常规 DLL 导出,您可能处理的是普通字符串,而不是 BSTR - BSTR 通常跨 COM 接口传递。我没有太多使用 VB6 绑定,所以我不能肯定地说,但这可能是你的问题的原因。在任何情况下,BSTR 仍然是 16 位,即使您为 MBCS 构建。
  • 如果您在 VB6 中将函数声明为采用 String 参数,则 VB6 的 UTF-16 字符串将在调用期间转换为“ANSI”字符串。将参数声明为ByVal … As Long,并传递StrPtr,则传递指向原始UTF-16数据的指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2011-09-11
  • 1970-01-01
  • 2014-06-21
  • 2012-05-13
  • 2023-03-22
相关资源
最近更新 更多