程序显示汉字乱码,这是因为汉字需要用2个字节来进行编码,英文用一个字节编码。所以得使用占2个字节的变量类型来存放汉字。

(1)char类型,占一个字节,char ch = ‘s’;

wchar_t类型宽字符,一个whcart_t占2个字节,wchar_t var1 = L'你';wchar_t var2[3] = L"你好";

(2)string是以char作为模板参数的模板类实例,所以汉字对于char和string都是不能正常显示。

wstring是以wchar_t作为模板参数的模板类实例,所以wstring和wchar_t可以用来存储汉字并正常显示。

string与wstring在windows平台的转换方法如下:


#include <Windows.h>
wstring stringTowstring(string str)
{  wstring result;  //获取缓冲区大小,并申请空间,缓冲区大小按字符计算  int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);  TCHAR* buffer = new TCHAR[len + 1];  //多字节编码转换成宽字节编码  MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);  buffer[len] = '\0';             //添加字符串结尾  //删除缓冲区并返回值  result.append(buffer);  delete[] buffer;  buffer = NULL;return result;
}
//将wstring转换成string
string wstring2string(wstring wstr)
{  string result;  //获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的  int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);  char* buffer = new char[len + 1];  //宽字节编码转换成多字节编码  WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);  buffer[len] = '\0';  //删除缓冲区并返回值  result.append(buffer);  delete[] buffer;  return result;
} 

wstring 与wchar转换: 

std::wstring strWs = L"CUST";
    wchar_t str[20] = {0};
    swprintf_s(str,19,L"%s",strWs.c_str());

跨平台的转化方法如下:


#include <cstdlib>
#include <string.h>
#include <string>// wstring => string
std::string WString2String(const std::wstring& ws)
{std::string strLocale = setlocale(LC_ALL, "");const wchar_t* wchSrc = ws.c_str();size_t nDestSize = wcstombs(NULL, wchSrc, 0) + 1;char *chDest = new char[nDestSize];memset(chDest,0,nDestSize);wcstombs(chDest,wchSrc,nDestSize);std::string strResult = chDest;delete []chDest;setlocale(LC_ALL, strLocale.c_str());return strResult;
}// string => wstring
std::wstring String2WString(const std::string& s)
{std::string strLocale = setlocale(LC_ALL, ""); const char* chSrc = s.c_str();size_t nDestSize = mbstowcs(NULL, chSrc, 0) + 1;wchar_t* wchDest = new wchar_t[nDestSize];wmemset(wchDest, 0, nDestSize);mbstowcs(wchDest,chSrc,nDestSize);std::wstring wstrResult = wchDest;delete []wchDest;setlocale(LC_ALL, strLocale.c_str());return wstrResult;
}

文章中有些内容参考与:

string和wstring的互转_老王的专栏-CSDN博客_string转wstring

C++进阶—>带你理解多字节编码与Unicode码_小伟锅的博客-CSDN博客

注:

1、字符串前面加L表示该字符串是Unicode字符串,每个字符占用两个字节。  
  eg: 
  strlen("asd") = 3;   
  strlen(L"asd") = 6;  
  2、 _T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式  。TEXT,_TEXT 和_T 一样的

如果你定义了UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("ABCD") 相当于 L"ABCD" ,这是宽字符串。 
  如果没有定义,那么_T宏不会在字符串前面加那个L,_T("ABCD") 就等价于 "ABCD"  。

“L”与_T的介绍参考与C++中L的意思_GPNU-IOT的博客-CSDN博客_c++ l

C++/Qt中文显示乱码与string/wstring/wchar_t转换相关推荐

  1. QT中文显示乱码解决

    问题如下: 1.中文显示乱码 2.数据库连接不上 问题一:但是如果我们的软件只运行在中文系统下,最简单的方法:在main函数中调用QTextCodec::setCodecForTr( QTextCod ...

  2. QT的中文显示乱码问题解决

    QT的中文显示乱码问题解决 QT的中文显示乱码问题解决: 1.查看源文件的编码格式,有必要的话转换源文件的编码格式再重新编译运行尝试汉字能否正常显示. 2.在代码里面解决: 3.用法: QT的中文显示 ...

  3. QT + MinGW 中文显示乱码解决方案

    QT + MinGW 中文显示乱码解决方案 1.将cpp文件从使用UTF-8改为使用UTF-8-BOM编码方式,中文就可以显示了! 2.代码如下: DialogInput Input(QString: ...

  4. PL/SQL 中文显示乱码解决方案

    为什么80%的码农都做不了架构师?>>>    PL/SQL 中文显示乱码: 1.修改注册表进行设置: HKEY_LOCAL_MACHINE->SOFTWARE->ORA ...

  5. oracle11g怎么显示中文,ORACLE11G中PLSQL中文显示乱码、Linux下sqlplus查询中文乱码

    问题描述: 本地是win7操作系统,cmd里面sqlplus进去连接oracle数据库,中文可以正常显示,但是plsql连接oracle数据库,中文显示乱码,还有xshell远程连接oracle服务器 ...

  6. Win7安装软件,界面上中文显示乱码的解决方案

    Win7安装软件,界面上中文显示乱码的解决方案 参考文章: (1)Win7安装软件,界面上中文显示乱码的解决方案 (2)https://www.cnblogs.com/heyang78/p/42588 ...

  7. Oralce Plsql 中文显示乱码问题无需修改注册表完美解决

    Oralce Plsql 中文显示乱码问题无需修改注册表完美解决 参考文章: (1)Oralce Plsql 中文显示乱码问题无需修改注册表完美解决 (2)https://www.cnblogs.co ...

  8. SSH,telnet终端中文显示乱码解决办法

    SSH,telnet终端中文显示乱码解决办法 vi /etc/sysconfig/i18n 将内容改为 LANG="zh_CN.GB18030" LANGUAGE="zh ...

  9. PLSQLDeveloper SQL查询内容中文显示乱码

    PLSQL Developer中文显示乱码是因为Oracle数据库所用的编码和PLSQL Developer所用的编码不同所导致的. 解决方法: 1,查询Oralce所用的编码 2,设置PLSQL 的 ...

  10. 服务器不能显示中文,彻底解决delphi WebBroker服务器中文乱码 delphi WebBroker服务器不能显示中文网页 WebBroker中文显示乱码...

    彻底解决delphi WebBroker服务器中文乱码 彻底解决WebBroker中文显示乱码 彻底解决delphi WebBroker服务器不能显示中文网页 这个问题被折腾惨啦! 网上一大堆,就没能 ...

最新文章

  1. rat/rats--用有理数形式表示矩阵
  2. 50个python库
  3. linux磁盘分区表解读:只占64字节
  4. ***学习笔记教程五:***技术
  5. 动手写的Python的HTML语法分析器(面向对象)
  6. java第一天上班需要安装那些_明天第一天上班,应该带什么包啊
  7. Python-非关键字参数和关键字参数(*args **kw)
  8. 如何才能学好javascript
  9. 你确定了项目,就不要乱变了
  10. 04_(终结版)通过App实现对数据库的增删改
  11. 自学python到什么程度就可以工作-零基础学到什么程度可以找一份python工作?Python学习路线规划...
  12. 服务器之间远程拷贝scp
  13. Artstudio Pro for mac(绘图和编辑工具)
  14. u8系统怎么进服务器取数,u8服务器如何连接数据库
  15. 关卡 - Aragami关卡设计
  16. 《惊人的假说-灵魂的科学探索》读书笔记(1)
  17. 华科_图形学笔记_09_奇妙的真实感_片元着色01_01
  18. ant pro-table点击表格行高亮显示
  19. 积累小结-无法将文件”obj\debug\XXX.dll复制到“bin\Debug\XXX.dll” 拒绝访问
  20. openlayers划线、标记点

热门文章

  1. 数据结构与程序的关系_java主程:数据结构和算法的区别别再搞混了,否则开除...
  2. 页码太靠上怎么办_醉酒后难受怎么办?酸奶、解酒药都不靠谱,最实用的还是3个方法...
  3. java 怎么调用clojure_从java调用Clojure时Clojure状态的范围
  4. jamon java_JAMon监控web工程方法的调用性能
  5. 样条曲线_概念设计:如何控制相关样条曲线几何图形?
  6. linux中脚本退出函数,PowerShell中使用return语句退出函数例子
  7. centos安装cmake
  8. stm32CubeMx lwip + freeRTOS
  9. Spring Cloud入门五 hystrix
  10. 业务逻辑配置化的可选技术方案