【问题标题】:How to convert u32string to int in C++11?如何在 C++11 中将 u32string 转换为 int?
【发布时间】:2013-05-11 17:17:40
【问题描述】:

我们如何在 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)

【问题讨论】:

    标签: c++ string c++11 localization type-conversion


    【解决方案1】:
    #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)); }
    

    【讨论】:

    • clang和gcc好像还没有实现codecvt。。。这种情况下怎么解决这个问题?
    • @danilo2 如果您查看例如this reference 你会看到std::codecvt_utf8std::codecvt 的特化。如果您没有std::codecvt_utf8,那么您可以简单地执行例如typedef std::codecvt&lt;char32_t, char, std::mbstate_t&gt; utf8_codecvt_t;
    • 在使用 gcc-4.7.2 或 clang-3.4 编译代码时,没有文件 codecv 所以它甚至不能被包含......所以不可能这样解决它,我我错了吗?
    • @danilo2 首先在构建时尽量使用-std=c++11标志,否则&lt;codecvt&gt;是C++11中新增的,codecvt类在头文件@987654333中定义@.
    【解决方案2】:

    已编辑,因为我的第一个答案很愚蠢。

    这是我设法做的,但是它可能不是很有效,并且它假定您的字符串是有效的。

    #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);
    }
    

    【讨论】:

    • 否:no known conversion from 'const char32_t *' to 'const char *' for 1st argument
    • 适用于u16stringu32stringWindows MinGW-w64 4.9.0
    • 这个答案是完全错误的!您不能将 char32_t 转换为 char。通常你需要一个单独的函数来从 u32string 转换为字符串。然后你必须打印它。
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2013-04-18
    • 2011-12-21
    相关资源
    最近更新 更多