首页 > 编程语言 >C++11 unistring 类(编码转换)

C++11 unistring 类(编码转换)

时间:2022-10-30 00:44:33浏览次数:48  
标签:11 std const string C++ wstring str unistring

C++11 的编码转换程序:

 

#ifndef UNISTRING_HPP
#define UNISTRING_HPP

#include <algorithm>
#include <codecvt>
#include <cstdio>
#include <cstdarg>
#include <iostream>
#include <string>
#include <sstream>

// locale = "chs" | "zh-cn"
//const std::string language = "chs";
const std::string language = "zh-cn";

inline void init_locale()
{
    std::locale::global(std::locale(language));
}

// 转换成小写
template<typename T>
inline std::basic_string<T> to_lower(const std::basic_string<T>& str)
{
    std::basic_string<T> product(str);
    for (auto& ch : product) {
        ch = std::tolower(ch, std::locale());
    }    
    return product;
}

// 转换成大写
template<typename T>
inline std::basic_string<T> to_upper(std::basic_string<T> str)
{
    std::basic_string<T> product(str);
    for (auto& ch : product) {
        ch = std::toupper(ch, std::locale());
    }    
    return product;
}

// unicode 字符串转换成 ansi 字符串
inline std::string to_ansi(const wchar_t* str, size_t length)
{
    typedef std::codecvt_byname<wchar_t, char, std::mbstate_t> arg_t;
    static std::wstring_convert<arg_t> convertor(new arg_t(language));
    return convertor.to_bytes(str, str + length);
}

inline std::string to_ansi(const std::wstring& str)
{
    return to_ansi(str.c_str(), str.length());
}

// ansi 字符串转换成 unicode 字符串
inline std::wstring to_unicode(const char* str, size_t size)
{
    typedef std::codecvt_byname<wchar_t, char, std::mbstate_t> arg_t;
    static std::wstring_convert<arg_t> convertor(new arg_t(language));
    return convertor.from_bytes(str, str + size);
}

inline std::wstring to_unicode(const std::string& str)
{
    return to_unicode(str.c_str(), str.length());
}

// utf8 字符串转 unicode 字符串
inline std::wstring utf8_to_unicode(const std::string& str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> convertor;
    return convertor.from_bytes(str);
}

// unicode 字符串转 utf8 字符串
inline std::string to_utf8(const std::wstring& str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> convertor;
    return convertor.to_bytes(str);
}

// ansi 字符串转 utf8 字符串
inline std::string to_utf8(const std::string& str)
{
    return to_utf8(to_unicode(str));
}

// 字符串转其他类型
template<typename T, typename _char_t>
inline T to_numeric(const std::basic_string<_char_t>& str)
{
    std::basic_stringstream<_char_t> stm(str);
    T n;
    stm >> n;
    return n;
}

//
// unicode 字符串类
//

class unistring : public std::wstring
{
public:
    unistring() : std::wstring() {}
    unistring(const char* str) : std::wstring(to_unicode(str, strlen(str))) {}
    unistring(const char* str, size_t size) : std::wstring(to_unicode(str, size)) {}
    unistring(const wchar_t* str) : std::wstring(str) {}
    unistring(const wchar_t* str, size_t size) : std::wstring(str, size) {}

    // 整数转字符串
    unistring(int n) : std::wstring(std::to_wstring(n)) {}

    // 单实数转字符串
    unistring(float n) : std::wstring(std::to_wstring(n)) {}

    // 双实数转字符串
    unistring(double n) : std::wstring(std::to_wstring(n)) {}

    // std::string
    unistring(const std::string& str) : std::wstring(to_unicode(str)) {}

    // std::wstring
    unistring(const std::wstring& str) : std::wstring(str) {}

    // 复制构造
    unistring(const unistring& str) : std::wstring(str.c_str(), str.length()) {}

    // 赋值
    unistring& operator=(const unistring& str)
    {
        std::wstring::assign(str.begin(), str.end());
        return *this;
    }

    // 数值转换
    int to_int()const
    {
        return to_numeric<int>(*this);
    }

    float to_float()const
    {
        return to_numeric<float>(*this);
    }

    double to_double()const
    {
        return to_numeric<double>(*this);
    }

    // 格式化字符串。只为简短信息设计,缓冲区大小 1024
    unistring& format(const wchar_t* param, ...)
    {
        wchar_t buf[1024] = { 0 };
        va_list body;
        va_start(body, param);
        _vsnwprintf(buf, 1024, param, body);
        va_end(body);

        this->assign(buf);
        return *this;
    }
};

// 标准输出支持
inline std::ostream& operator << (std::ostream& out, const unistring& str)
{
    out << to_ansi(str);
    return out;
}

#endif// UNISTRING_HPP

 

标签:11,std,const,string,C++,wstring,str,unistring
From: https://www.cnblogs.com/sdragonx/p/16840325.html

相关文章

  • C++ Primer Plus学习笔记之复合类型(上)
    前言个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系。一直以来都很想深入学习一下C++,将其作为自己的主力开发语言。现在为......
  • C++求高精度pi(1)BBP公式
    C++求高精度pi(1)前言(之后再写)BBP公式由arctan1展开得到的莱布尼茨级数是一个交错级数,并且条件收敛而不绝对收敛,这注定了莱布尼兹级数方法会非常低效而BBP公式$$\sum......
  • 重建控制文件出现ORA-01159、ORA-01517告警
    问题描述:将windows上的数据文件、控制文件拷贝到linux相应目录后,重建控制文件出现ORA-01159、ORA-01517告警,如下所示:源端:windows200332位+oracle10.2.0.432位目标端:ce......
  • AcWing 1113. 红与黑
    蒟蒻只会暴搜了要点是先找到起点,从起点开始向各个方向搜DFS:(DFS当然也可以用for(inti=0;i,4;i++)来搜索四个方向,这里是个人习惯)#include<iostream>#include<cstring......
  • C++ STL
    概述STL主要有container,algorithm和iterator三大部分构成容器用于存放数据对象算法用于操作容器中的数据对象迭代器是算法和容器之间的中介STL容器STL容器是一种数据结构......
  • Modf is not a member of std in C++
    ModfisnotamemberofstdinC++ 2minuteread OnthispageIntroductionPotentialcausesFix#1:AddiostreamtoyourdepedenciesFix#2:Usingnamesp......
  • python 与C++ 利用socket实现json数据传输
    单机python与C++程序利用socket实现json数据传输目录单机python与C++程序利用socket实现json数据传输需求实现方法的选择具体实现流程图示涉及到的技术1socket......
  • 66-ES11-动态import
     ......
  • 68-ES11-绝对全局对象globalThis
     ......
  • 65-ES11-可选链操作符
     ......