linux string和wstring的转化
wstring 的 size() 函数返回的就是包含的中英文字符个数。wstring 与 string 一样都是基于 basic_string 类模板,不同的是 string 使用 char 为基本类型,而 wstring 是 wchat_t。wchar_t 可以支持 Unicode 字符的存储,在 Win 下是两个字节, Linux 的实现则是四个字节,可以直接用 sizeof(wchar_t)
查看类型长度。
string 与 wstring 的转换
转换版本一
如果你的 g++ 版本够高(5.0以上),那么可以采用下面的写法,这是最好的:
#include <codecvt>
#include <string>std::wstring s2ws(const std::string& str)
{using convert_typeX = std::codecvt_utf8<wchar_t>;std::wstring_convert<convert_typeX, wchar_t> converterX;return converterX.from_bytes(str);
}std::string ws2s(const std::wstring& wstr)
{using convert_typeX = std::codecvt_utf8<wchar_t>;std::wstring_convert<convert_typeX, wchar_t> converterX;return converterX.to_bytes(wstr);
}
std::wstring_convert 是 C++11 标准库提供的对 string 和 wstring 的转换,对 Unicode 进行了语言和库级别的支持。但这一特性在 gcc/g++ 5.0 以上才被支持。
参考资料:
How to convert wstring into string? — stackoverflow
std::wstring_convert — cppreference
std::wstring_convert — cplusplus
转换版本二
如果你的 g++ 版本是支持部分 c++11 特性,那么第二个版本可以用 unique_ptr 来管理内存,这样可以避免直接操作指针的尴尬,程序更加安全。
#include <cstdlib>
#include <memory>
#include <string>std::wstring s2ws(const std::string& str) {if (str.empty()) {return L"";}unsigned len = str.size() + 1;setlocale(LC_CTYPE, "en_US.UTF-8");std::unique_ptr<wchar_t[]> p(new wchar_t[len]);mbstowcs(p.get(), str.c_str(), len);std::wstring w_str(p.get());return w_str;
}std::string ws2s(const std::wstring& w_str) {if (w_str.empty()) {return "";}unsigned len = w_str.size() * 4 + 1;setlocale(LC_CTYPE, "en_US.UTF-8");std::unique_ptr<char[]> p(new char[len]);wcstombs(p.get(), w_str.c_str(), len);std::string str(p.get());return str;
}
new 数组的长度要考虑到,因为 wchar_t 为 4 个字节,对于 s2ws, wstring 的长度肯定小于等于 string 的长度,而对 ws2s, string 的长度也肯定小于等于 wstring 4 倍的长度。+1 是预留给字符串的结束符 ‘\0’。
setlocale 函数用于运行时的语言环境,可以在命令行用 locale 查看当前系统的语言环境设置,LC_CTYPE 指语言符号及其分类 。网上很多版本使用 setlocale(LC_CTYPE, "");
, 这里第二个参数用空字符串,会使用系统当前默认的 locale 设置。但是这样有个问题,也许你写出来的程序在本机运行正确,但到服务器上就错了,因为服务器的 locale 不一定是 utf8,所以这里要强制设置为 en_US.UTF-8。
mbstowcs 和 wcstombs 是两个 C 语言中对多字节字符串和宽字符字符串的互相转换函数,依赖于当前 locale 中所指定的字符编码。
转换版本三
如果 g++ 连 unique_ptr 都不支持,那就只能使用下面的 new/delete 了。
#include <cstdlib>
#include <string>std::wstring s2ws(const std::string& str) {if (str.empty()) {return L"";}unsigned len = str.size() + 1;setlocale(LC_CTYPE, "en_US.UTF-8");wchar_t *p = new wchar_t[len];mbstowcs(p, str.c_str(), len);std::wstring w_str(p);delete[] p;return w_str;
}std::string ws2s(const std::wstring& w_str) {if (w_str.empty()) {return "";}unsigned len = w_str.size() * 4 + 1;setlocale(LC_CTYPE, "en_US.UTF-8");char *p = new char[len];wcstombs(p, w_str.c_str(), len);std::string str(p);delete[] p;return str;
}
参考:Linux C++ 中文处理 (uincode与utf-8相互转化)
linux string和wstring的转化相关推荐
- string和wstring相互转换
VS2015+QT环境,加载dll函数loadlibrary,使用宽字符参数.路径有汉字总加载失败,于是先将汉字转化再加载dll,成功. std::string ConvertUtf8ToGbk(co ...
- C++排雷:19.过滤英文和中文标点符号,string与wstring之间的转换
想要过滤一个文本中的标点符号. 对英文标点符号可以使用cctype中的ispunct方法来识别 而对于中文标点符号,则需要一定的转换: C++用string来处理字符串. string是窄字符串ASC ...
- C++string与wstring类型转换
在c++开发时有的库函数必须传递wstring宽字符串作为参数,在代码中通过L"wstring"定义宽字符串传递参数这没什么难度,问题是实际过程中需要接收输入string数据,这时 ...
- C++中const char*, string 与char*的转化
C++中const char*, string 与char*的转化 原文:https://blog.csdn.net/zhang_alongzd/article/details/52790905 版权 ...
- wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString....转换
wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString.... #include <strin ...
- PInvoke复习之深入理解char*与wchar_t*与string以及wstring之间的相互转换
本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下 #ifndef USE_H_ #define USE_H_ #i ...
- wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString 以及system(command)...
转载:http://blog.csdn.net/chocolateconanlan/article/details/4058868 wchar_t*,wchar_t,wchat_t数组,char,ch ...
- string、wstring、cstring、 char、 tchar、int转换方法
1.string转wstring ? 1 2 3 4 5 6 7 wstring s2ws(const string& s) { _bstr_t t = s.c_str(); wchar_ ...
- string、wstring、UTF-8、UTF-16、UTF-32之间转换
//string转wstring std::wstring string_to_wstring(const std::string& str) { setlocale(LC_ALL, &quo ...
最新文章
- SSM中进行Junit单元测试时无法注入service
- 一文彻底搞懂字符串、字符串常量池原理
- cf不能全屏win7的解决方法_win10玩cf不能全屏的解决方法教程
- 蓝桥杯集训之开训第一课
- android finish 判断当前_Android开发,源码分析finish()和onBackPressed()的区别
- 防抖与节流方案_手写系列之防抖和节流
- 3DLC系列之:2D 曲线面板
- 全志V3s IIC控制器驱动分析
- 小米tts语音引擎下载_在手机和 AIoT 双战场打拼的小爱同学,会把语音助手带向何方?...
- 离线语音交互技术路线之语音合成(TTS)篇
- --nuhub--linux
- Android+Blockly大作业(含登录注册系统、碎片式浏览、Blockly设计)
- python 连接mysql_Python 连接MySQL
- 【人工智能实验】运用贝叶斯决策理论实现手写数字识别
- PAT A1027 Colors in Mars
- 厨电新十年,不可逆的行业分化与老板电器的数字进化
- Android 识别SIM卡类型
- LeetCode 283 移动零
- 最全的PDF转Word方案,办公族都需要
- Robosense速腾激光雷达如何在线连接雷达并发送点云数据到ROS