版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qing666888/article/details/83345943
在编写x64dbg插件的过程中,发现插件菜单中文乱码的问题,后来明白是由于编码的问题导致的,由于x64dbg好像是Qt开发的界面,使用的是utf-8编码的,而我使用的vs2017开发的插件,使用的是Unicode编码。编码不一样导致中文乱码。
先了解一下各种编码ASCII、Unicode和UTF-8的关系:
简单归纳:
编码 | 大小 | 支持 |
---|---|---|
ASCII | 1个字节 | 英文 |
Unicode | 2个字节(生僻字4个) | 所有语言 |
UTF-8 | 1-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节 | 所有语言 |
VS中有字符集设置Unicode和多字节字符集:对应着C++基本数据类型分别为:char、wchar_t。
char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表示一个字时可能是一个字节也可能是多个字节。一个英文字符(如’s’)用一个char(一个字节)表示,一个中文汉字(如’中’)用3个char(三个字节)表示
wchar_t保存Unicode的编码,所有的字符都使用2个字节保存。
C++在处理unicode上一向是太弱,即使有w_char的选项,但是在跨平台和兼容性上面实在是欠佳。
所以VS开发我们使用的是Unicode编码或者多字节编码,而x64dbg使用的是utf-8编码,需要把字符串转换成utf-8编码格式,所以我们需要采用第三方库UTF-8-CPP库进行转换。
http://utfcpp.sourceforge.net/
用法:
#include "utf8.h"
wchar_t p[512];
std::wstring utf16line(p, len);
std::string utf8line;
utf8::utf16to8(utf16line.begin(), utf16line.end(), std::back_inserter(utf8line));
提供一个其他转换函数:
std::string string_To_UTF8(const std::string & str)
{
int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴
ZeroMemory(pwBuf, nwLen * 2 + 2);
::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char * pBuf = new char[nLen + 1];
ZeroMemory(pBuf, nLen + 1);
::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
std::string retStr(pBuf);
delete[]pwBuf;
delete[]pBuf;
pwBuf = NULL;
pBuf = NULL;
return retStr;
}