【问题标题】:How do I tell a wstring that a string I am feeding it is already a wstring?如何告诉 wstring 我正在输入的字符串已经是 wstring?
【发布时间】:2011-03-26 04:12:01
【问题描述】:

我使用 std::string 作为文本缓冲区。然后,我确定该缓冲区中包含的数据是 UTF-16(即它实际上是一个 std::wstring)。 如何将 std::string 强制转换为 std::wstring? std::string 用词不当,数据实际上是 wstring。

【问题讨论】:

  • std::string≠二进制缓冲区!使用更合适的数据类型,例如std::vector<uint8_t>

标签: c++ stl wstring


【解决方案1】:

考虑使用std::vector<char> 而不是std::string。当您需要“连续的字节序列”时,它是正确的容器。

使用std::vector 源容器,代码相当简单,假设您真的只想重新解释数据(即,您真的只想将字节视为wchar_t 的序列):

std::vector<char> v = get_my_wstring_character_data();
if (v.size() % sizeof (wchar_t) != 0)
    throw std::runtime_error("Invalid wstring length");

std::wstring ws(reinterpret_cast<wchar_t*>(&v[0]), 
                reinterpret_cast<wchar_t*>(&v[0] + v.size()));

如果您的来源是std::string,如果您可以保证您正在使用的std::string 的实现连续存储其字符,那么同样的方法也将起作用。在实践中,情况总是如此。

【讨论】:

  • “在实践中,情况总是如此。”你不知道我在理论上浪费了多少时间。实践是图书馆,极大地帮助实施。谢谢。
  • 请注意 Jon 的警告:wchar_t 的大小以及它如何表示字符都是实现定义的,因此如果您正在编写需要在多个平台上运行的代码,则不能依靠它具有特定的大小和形式。
  • v.data() 是一个指向连续的char[] 的指针,它可以便携地使用而不是&amp;v[0]。你当然不能用那个解决wchar_t =?= UTF-16 的问题。
【解决方案2】:

无法保证std::wstring 将字节数组存储/解释为 UTF-16(尽管在 Windows 中发生这样做)。看看这个问题:std::wstring VS std::string

因此,我建议您重新考虑从 UTF-16 编码字节数组构造 std::wstring 的想法,除非您确定您的应用程序只会使用 MSVC 编译。

【讨论】:

  • 有问题的特定代码涉及 Win32 API,这就是我首先选择std::wstring 的原因。我是个 unix 疯子,直到在 MSVC 调试器中才知道 wstring ;)
猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
相关资源
最近更新 更多