gpt4 book ai didi

c++ - 比较 std::wstring 和 std::string

转载 作者:太空狗 更新时间:2023-10-29 19:49:41 36 4
gpt4 key购买 nike

如何比较 wstring,例如 L"Hello",与 string?如果我需要有相同的类型,我如何将它们转换成相同的类型?

最佳答案

既然你问了,这是我从字符串到宽字符串的标准转换函数,使用 C++ std::stringstd::wstring 类实现。

首先,确保使用 set_locale 启动您的程序:

#include <clocale>

int main()
{
std::setlocale(LC_CTYPE, ""); // before any string operations
}

现在介绍函数。首先,从窄字符串中获取宽字符串:

#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cwchar>
#include <cerrno>

// Dummy overload
std::wstring get_wstring(const std::wstring & s)
{
return s;
}

// Real worker
std::wstring get_wstring(const std::string & s)
{
const char * cs = s.c_str();
const size_t wn = std::mbsrtowcs(NULL, &cs, 0, NULL);

if (wn == size_t(-1))
{
std::cout << "Error in mbsrtowcs(): " << errno << std::endl;
return L"";
}

std::vector<wchar_t> buf(wn + 1);
const size_t wn_again = std::mbsrtowcs(buf.data(), &cs, wn + 1, NULL);

if (wn_again == size_t(-1))
{
std::cout << "Error in mbsrtowcs(): " << errno << std::endl;
return L"";
}

assert(cs == NULL); // successful conversion

return std::wstring(buf.data(), wn);
}

然后回过头来,用宽字符串制作窄字符串。我将窄字符串称为“语言环境字符串”,因为它根据当前语言环境采用平台相关编码:

// Dummy
std::string get_locale_string(const std::string & s)
{
return s;
}

// Real worker
std::string get_locale_string(const std::wstring & s)
{
const wchar_t * cs = s.c_str();
const size_t wn = std::wcsrtombs(NULL, &cs, 0, NULL);

if (wn == size_t(-1))
{
std::cout << "Error in wcsrtombs(): " << errno << std::endl;
return "";
}

std::vector<char> buf(wn + 1);
const size_t wn_again = std::wcsrtombs(buf.data(), &cs, wn + 1, NULL);

if (wn_again == size_t(-1))
{
std::cout << "Error in wcsrtombs(): " << errno << std::endl;
return "";
}

assert(cs == NULL); // successful conversion

return std::string(buf.data(), wn);
}

一些注意事项:

  • 如果您没有 std::vector::data(),您可以说 &buf[0]
  • 我发现 r 风格的转换函数 mbsrtowcswcsrtombs 在 Windows 上不能正常工作。在那里,您可以使用 mbstowcswcstombs 代替:mbstowcs(buf.data(), cs, wn + 1);, wcstombs(buf.data(), cs, wn + 1);


针对您的问题,如果要比较两个字符串,可以将它们都转换为宽字符串,然后再进行比较。如果您正在从具有已知编码的磁盘读取文件,您应该使用 iconv() 将文件从您已知的编码转换为 WCHAR,然后与宽字符串进行比较。

但是请注意,复杂的 Unicode 文本可能有多个不同表示作为代码点序列,您可能希望将它们视为相等。如果可能的话,您需要使用更高级别的 Unicode 处理库(例如 ICU)并将您的字符串规范化为某种常见的、可比较的形式。

关于c++ - 比较 std::wstring 和 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7141260/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com