首页 > 编程语言 >C++语言string、wstring、utf-8互转

C++语言string、wstring、utf-8互转

时间:2023-12-12 15:33:07浏览次数:28  
标签:std utf string C++ wstring static str 互转 const

实现了一个CStrCvt类,采用STL实现,可跨平台。注意的是,在s2ws和ws2s函数中需要locale信息,在使用过程中,需要根据实际情况进行设置。如果有需要可以检测文本编码,网上有开源的第三方库,可供使用。不过,准确率需自己判断。为了不影响效率,此类默认按照中文处理。

头文件

class CStrCvt
{
public:
    static std::string ws2utf8(const std::wstring& str);
    static std::wstring utf82ws(const std::string& str);
    static std::string s2utf8(const std::string& str);
    static std::string utf82s(const std::string& str);
    static std::string ws2s(const std::wstring& str/*, const std::string& locname = ("chs")*/);
    static std::wstring s2ws(const std::string& str/*, const std::string& locname = ("chs")*/);
};

源文件

#include <codecvt>

std::string CStrCvt::ws2utf8(const std::wstring& str)
{
    static std::wstring_convert<std::codecvt_utf8<wchar_t> > strCnv;
    return strCnv.to_bytes(str);
}

std::wstring CStrCvt::utf82ws(const std::string& str)
{
    static std::wstring_convert< std::codecvt_utf8<wchar_t> > strCnv;
    return strCnv.from_bytes(str);
}

std::string CStrCvt::s2utf8(const std::string& str)
{
    return ws2utf8(s2ws(str));
}

std::string CStrCvt::utf82s(const std::string& str)
{
    return ws2s(utf82ws(str));
}

class codecvt:public std::codecvt_byname<wchar_t, char, std::mbstate_t> {
public:
    codecvt() : codecvt_byname("chs") { }
    codecvt(const std::string& locname) : codecvt_byname(locname) { }
    ~codecvt() {}
};

// UTF-16 to ANSI 为了提升性能暂只支持中文
std::string CStrCvt::ws2s(const std::wstring& str/*, const std::string& locname = ("chs")*/)
{
    static std::wstring_convert<codecvt> converter/*(locname)*/;
    return converter.to_bytes(str);
}

// ANSI to UTF-16 为了提升性能暂只支持中文
std::wstring CStrCvt::s2ws(const std::string& str/*, const std::string& locname = ("chs")*/)
{
    static std::wstring_convert<codecvt> converter/*(locname)*/;
    return converter.from_bytes(str);
}

 

标签:std,utf,string,C++,wstring,static,str,互转,const
From: https://www.cnblogs.com/kuaixue/p/17897035.html

相关文章

  • 算法战斗第一天C++1
    A.Watermelon西瓜(timelimitpertest:1second,memorylimitpertest:64megabytes,input:standardinput,output:standardoutput)OnehotsummerdayPeteandhisfriendBillydecidedtobuyawatermelon.Theychosethebiggestandtheripest熟one,int......
  • 在C++中,预处理器提供了一些符号和运算符,这些符号在宏定义中有特殊的含义
    在C++中,预处理器提供了一些符号和运算符,这些符号在宏定义中有特殊的含义。以下是一些常见的符号:#:字符串化运算符,用于将宏参数转换为字符串。#defineSTRINGIZE(x)#xstd::cout<<STRINGIZE(Hello);//输出"Hello"##:连接运算符,用于连接两个标记,使它们成为一个标记。#de......
  • C++调用opencv和windows api完成桌面窗口截图——以梦幻西游为例
    目录程序简介程序/数据集下载代码环境、文件结构代码分析结果展示程序简介项目编写的C++程序,根据输入的字符串,遍历所有桌面窗口标题,查找包含该标题的窗口,对该桌面窗口进行截图,以梦幻西游为例输入:桌面窗口包含的字符串比如输入“梦幻”,程序就会截取桌面“梦幻西游”的窗口输......
  • C++ 用 std::get<> 访问元组
     C++ 用std::get<>访问元组 #include<iostream>#include<tuple>intmain(){//Creatingatuplestd::tuple<int,double,std::string>myTuple(42,3.14,"Hello");//Accessingelementsusingstd::get<>......
  • C++(using namespace std;)
    usingnamespacestd;是C++中的一条指令,用于指示编译器使用标准命名空间std中的所有标识符。这意味着在代码中可以直接使用标准库中的各种类、函数和对象,而无需在每个标识符前面添加std::前缀。以下是关于这条指令的一些解释:using关键字:using是一个关键字,用于创建别......
  • C++连点器
     功能这个连点器可以提升你的CPS值,它可以让你的每一次点击变成好多次,左键右键均可。 要求它调用了"windos.h"函数库(Windows系统自带函数库)以及"bits/stdc++.h"函数库(C++拓展函数),若无法使用"bits.stdc++.h"函数库的,可以将其替换为"iostream.h"函数库和"cstdio.h"......
  • C++(std::vector)
    这段代码定义了一个std::vector对象,该对象的元素类型为float。std::vector是C++标准库中的动态数组容器,可以存储多个元素,并且大小可以动态调整。std::vector<float>具体解释如下:std::vector:这是C++标准库中的一个模板类,用于实现动态数组。std::vector是一个模板类,......
  • C++( get()方法、->、*)
    在C++中,指针是一种强大的工具,用于处理内存和访问数据。以下是一些与指针相关的基本概念和操作符:解引用运算符*:用于访问指针指向的内存地址处的值。例如,如果有一个指针int*ptr,则*ptr将返回指针所指向地址的整数值。intx=10;int*ptr=&x;std::cout<<*ptr;/......
  • 《Function Programming in C++》
    说明《FunctionalProgramminginC++》书中代码练习测试以及一些笔记,部分代码需要用到C++20可以使用在线编译器编译代码地址:https://coliru.stacked-crooked.com/或者自己编译gcc-11.2及以上版本安装1介绍1.1什么是函数式编程用常用的函数范式模板代替一些循环等,比如std......
  • Unreal C++自定义Actor设置StaticMesh和Material
    1.新建第三人称c++游戏(其它模板开局也可以的)2.新建继承自Actor的c++类3.添加静态网格体成员SM_MyActor,并在构造函数中进行相应的初始化UCLASS()classMYPROJECT9S_APIAMyActor:publicAActor{GENERATED_BODY()protected:/**Pleaseaddavariabledescripti......