如何在C++11中将u32string转换为int?

8

如何在C++11中将u32string转换为int

此外,如果我有一个可用的起始和结束迭代器,应该使用什么方法来将字符串的一部分转换为int

我尝试过:

u32string test=U"14";
cout << atoi(test.c_str());

但是它会抛出异常:
candidate function not viable: no known conversion from 'const char32_t *' to 'const char *' for 1st argument
extern int atoi (__const char *__nptr)
3个回答

10
#include <locale>   // wstring_convert
#include <codecvt>  // codecvt_utf8
#include <iostream> // cout
#include <string>   // stoi and u32string

int main() {
  std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> convert;

  std::u32string str = U"14";
  std::cout << std::stoi(convert.to_bytes(str));
}

这取决于UTF-8和"C"区域设置使用相同的数字表示。


GCC的标准库实现libstdc++尚未包含codecvt头文件或std::wstring_convert。libc++包含这两者,Visual Studio的标准库实现也是如此。如果您必须使用libstdc ++,则可能最容易自己实现一个简单的转换函数。

#include <algorithm> // transform
#include <iterator>  // begin, end, and back_inserter

std::string u32_to_ascii(std::u32string const &s) {
  std::string out;
  std::transform(begin(s), end(s), back_inserter(out), [](char32_t c) {
    return c < 128 ? static_cast<char>(c) : '?';
  });
  return out;
}

int u32toi(std::u32string const &s) { return stoi(u32_to_ascii(s)); }

似乎codecvt在clang和gcc中尚未实现...在这种情况下,我该如何解决这个问题? - Wojciech Danilo
如果您查看例如此参考资料,您会发现std::codecvt_utf8std::codecvt的一个特化版本。 如果您没有std::codecvt_utf8,则可以简单地执行例如typedef std::codecvt<char32_t, char, std::mbstate_t> utf8_codecvt_t; - Some programmer dude
在使用gcc-4.7.2或clang-3.4编译代码时,没有codecv文件,因此甚至无法包含...所以用这种方式解决是不可能的,我错了吗? - Wojciech Danilo
@danilo2 首先尝试在构建时使用“-std=c++11”标志,否则“<codecvt>”是C++11中的新功能,“codecvt”类定义在头文件“<locale>”中。 - Some programmer dude

0

我修改了我的第一个答案,因为它很愚蠢。

这是我所能做的,但它可能不是非常高效,并且它假设您的字符串是有效的。

#include <string>
#include <iostream>

int     main()
{
  std::u32string str = U"14";

  std::string res;
  for (auto c = str.begin(); c != str.end(); ++c)
    {
      char t = *c;
      res.push_back(t);
    }
  std::cout << "\nVal = " << atoi(res.c_str()) << std::endl;
  return (0);
}

第一个参数无法从 'const char32_t *' 转换为 'const char *'。 - Wojciech Danilo
适用于 u16stringu32stringWindows MinGW-w64 4.9.0 - mortalis
这个答案完全错误!你不能将char32_t转换为char。通常你需要一个单独的函数来将u32string转换为string。然后你需要打印它。 - user18853

0

虽然没有标准库函数可以实现这个功能,但幸运的是它很容易实现。

以下是一个通用的示例,可以在不进行昂贵的转换到std::string的情况下完成。

#include <string>
#include <iostream>

template<typename Out, typename In>
Out parse_int(In const& in)
{
    Out res = 0;
    std::size_t start = 0;
    while (std::isspace(in[start])) {
        start++;
    }
    std::size_t i = start;
    if (in[i] == '-') {
        i++;
    }
    while (std::isdigit(in[i])) {
        res = res * 10 + in[i++] - '0';
    }

    return in[start] == '-' ? -res : res;
}

int main()
{
    std::u32string s{ '1','2','3','4','5' };

    std::cout << parse_int<long long>(s) << std::endl;
}

parse_int 函数可以处理 u16stringu32stringu8stringstringwstring,利用了所有字符类型中数字使用相同值的事实。

在线演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接