如何将std::u16string转换为unsigned long long及其他数值类型?
将std::u16string转换为数值类型的方法
转换为unsigned long long
C++标准库没有直接提供对应std::u16string的std::stoull版本,最直接的解决方案是先将std::u16string转换为普通std::string,再调用标准的数值转换函数。
实现代码
#include <string> #include <codecvt> #include <stdexcept> unsigned long long u16_to_ull(const std::u16string& u16_str) { // 完成UTF-16到UTF-8的编码转换 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter; std::string utf8_str; try { utf8_str = converter.to_bytes(u16_str); } catch (const std::range_error&) { throw std::invalid_argument("无效的UTF-16字符串"); } // 调用标准转换函数得到unsigned long long return std::stoull(utf8_str); }
推广到其他数值类型
上述逻辑可以直接复用,只需将最终调用的转换函数替换为对应数值类型的版本即可:
- 转换为
int:使用std::stoi - 转换为
long:使用std::stol - 转换为
float:使用std::stof - 转换为
double:使用std::stod - 转换为
unsigned long:使用std::stoul
通用模板实现
如果需要更灵活的通用转换,可以编写模板函数:
#include <string> #include <codecvt> #include <stdexcept> #include <type_traits> template<typename T> typename std::enable_if<std::is_arithmetic<T>::value, T>::type u16string_to_num(const std::u16string& u16_str) { std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter; std::string utf8_str; try { utf8_str = converter.to_bytes(u16_str); } catch (const std::range_error&) { throw std::invalid_argument("UTF-16转UTF-8失败"); } if constexpr (std::is_same_v<T, unsigned long long>) { return std::stoull(utf8_str); } else if constexpr (std::is_same_v<T, int>) { return std::stoi(utf8_str); } else if constexpr (std::is_same_v<T, long>) { return std::stol(utf8_str); } else if constexpr (std::is_same_v<T, float>) { return std::stof(utf8_str); } else if constexpr (std::is_same_v<T, double>) { return std::stod(utf8_str); } else if constexpr (std::is_same_v<T, unsigned long>) { return std::stoul(utf8_str); } else { throw std::invalid_argument("不支持的数值类型"); } }
注意事项
- 编码转换兼容性:上述实现依赖
std::codecvt_utf8_utf16,该组件在C17中被标记为弃用,但主流编译器(GCC、Clang、MSVC)仍提供支持。若需C17+的替代方案,可考虑第三方库(如ICU)或平台特定编码转换API。 - 异常处理:转换过程可能抛出
std::invalid_argument(格式错误)或std::out_of_range(数值超出类型范围)异常,建议根据业务场景捕获处理。
内容的提问来源于stack exchange,提问作者Kaiyakha
相关产品推荐
相关产品推荐

