You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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("不支持的数值类型");
    }
}

注意事项

  1. 编码转换兼容性:上述实现依赖std::codecvt_utf8_utf16,该组件在C17中被标记为弃用,但主流编译器(GCC、Clang、MSVC)仍提供支持。若需C17+的替代方案,可考虑第三方库(如ICU)或平台特定编码转换API。
  2. 异常处理:转换过程可能抛出std::invalid_argument(格式错误)或std::out_of_range(数值超出类型范围)异常,建议根据业务场景捕获处理。

内容的提问来源于stack exchange,提问作者Kaiyakha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:35:18