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的转化相关推荐

  1. string和wstring相互转换

    VS2015+QT环境,加载dll函数loadlibrary,使用宽字符参数.路径有汉字总加载失败,于是先将汉字转化再加载dll,成功. std::string ConvertUtf8ToGbk(co ...

  2. C++排雷:19.过滤英文和中文标点符号,string与wstring之间的转换

    想要过滤一个文本中的标点符号. 对英文标点符号可以使用cctype中的ispunct方法来识别 而对于中文标点符号,则需要一定的转换: C++用string来处理字符串. string是窄字符串ASC ...

  3. C++string与wstring类型转换

    在c++开发时有的库函数必须传递wstring宽字符串作为参数,在代码中通过L"wstring"定义宽字符串传递参数这没什么难度,问题是实际过程中需要接收输入string数据,这时 ...

  4. C++中const char*, string 与char*的转化

    C++中const char*, string 与char*的转化 原文:https://blog.csdn.net/zhang_alongzd/article/details/52790905 版权 ...

  5. 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 ...

  6. PInvoke复习之深入理解char*与wchar_t*与string以及wstring之间的相互转换

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下 #ifndef USE_H_ #define USE_H_ #i ...

  7. 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 ...

  8. 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_ ...

  9. string、wstring、UTF-8、UTF-16、UTF-32之间转换

    //string转wstring std::wstring string_to_wstring(const std::string& str) { setlocale(LC_ALL, &quo ...

最新文章

  1. SSM中进行Junit单元测试时无法注入service
  2. 一文彻底搞懂字符串、字符串常量池原理
  3. cf不能全屏win7的解决方法_win10玩cf不能全屏的解决方法教程
  4. 蓝桥杯集训之开训第一课
  5. android finish 判断当前_Android开发,源码分析finish()和onBackPressed()的区别
  6. 防抖与节流方案_手写系列之防抖和节流
  7. 3DLC系列之:2D 曲线面板
  8. 全志V3s IIC控制器驱动分析
  9. 小米tts语音引擎下载_在手机和 AIoT 双战场打拼的小爱同学,会把语音助手带向何方?...
  10. 离线语音交互技术路线之语音合成(TTS)篇
  11. --nuhub--linux
  12. Android+Blockly大作业(含登录注册系统、碎片式浏览、Blockly设计)
  13. python 连接mysql_Python 连接MySQL
  14. 【人工智能实验】运用贝叶斯决策理论实现手写数字识别
  15. PAT A1027 Colors in Mars
  16. 厨电新十年,不可逆的行业分化与老板电器的数字进化
  17. Android 识别SIM卡类型
  18. LeetCode 283 移动零
  19. 最全的PDF转Word方案,办公族都需要
  20. Robosense速腾激光雷达如何在线连接雷达并发送点云数据到ROS

热门文章

  1. Latex 换行顶格、不缩进
  2. MySQL数据库中 int 长度最大是多少?
  3. 【高级篇 / SDWAN】(7.0) ❀ 01. 如何将正在使用的宽带加入 SD-WAN ❀ FortiGate 防火墙
  4. Top Android App使用的组件(一)
  5. 关于泛型(Generics)
  6. 2010年数学二真题手稿解析
  7. 搭建 Git 服务器
  8. lenovo thinkpad t460s tlp-stat 修复acpi_call
  9. kaldi中特征变换
  10. 如何科学的从某宝身上媷羊毛?