【如何利用QString实现c++中文字符编码格式的转换】

一、问题来源

我开发的软件SmartPipe已经在弯管生产中开始使用,有客户反馈,如果弯管零件的名称为中文的时候,自动导出的.ybc文件和.xyz文件名称为乱码,如图所示,于是为了解决这个问题,开展了一番研究。
【如何利用QString实现c++中文字符编码格式的转换】_第1张图片

二、背景知识

首先需要明确的是,在C++中,char类型和string类型,一般用来表示字符(包括字母、数字、符号等)。在计算机中,这些字符通常由对应的编码值表示。常见的编码方式包括ASCII(American Standard Code for Information Interchange)编码和Unicode编码等。

在ASCII编码中,每个字符使用一个字节表示;而在Unicode编码中,每个字符使用一个或多个字节表示,具体取决于采用的编码方式(如UTF-8、UTF-16、UTF-32等)。

需要注意的是,如果将一个字符序列从一个编码方式转换到另一种编码方式,需要进行字符集转换。字符集转换是将一个字符序列从一种编码方式转换到另一种编码方式的过程,它需要考虑到字符编码的不同、字符集的兼容性、字符集转换过程中可能出现的错误等因素。

三、问题定位

我的另存ybc、xyz文件的代码如下

GenBendYbcFile(finalXYZFileName.toStdString().c_str(), finalYBCFileName.toStdString().c_str())

其中,finalXYZFileName和finalYBCFileName都是QString类型的变量,但是编码方式是UTF-8,如果含有中文的情况,需要转成GBK的编码才行。

四、解决办法

可以采用windows.h提供的MultiByteToWideChar等方法,以下是亲测有效的一段代码。

std::string pmUtils::utf8_to_gbk(std::string utf8_str)
{
	int wchar_len = MultiByteToWideChar(CP_UTF8, 0, utf8_str.c_str(), -1, NULL, 0);
	wchar_t* wchar_buf = new wchar_t[wchar_len];
	MultiByteToWideChar(CP_UTF8, 0, utf8_str.c_str(), -1, wchar_buf, wchar_len);

	int char_len = WideCharToMultiByte(CP_ACP, 0, wchar_buf, -1, NULL, 0, NULL, NULL);
	char* char_buf = new char[char_len];
	WideCharToMultiByte(CP_ACP, 0, wchar_buf, -1, char_buf, char_len, NULL, NULL);

	std::string gbk_str(char_buf);
	delete[] wchar_buf;
	delete[] char_buf;

	return gbk_str;
}

由于我的项目是采用QT写的,我这次尝试采用QString实现c++中文字符编码格式的转换。

QByteArray local8BitArray = QString(UTF8String.c_str()).toLocal8Bit();
QString gbkQStr = QString::fromLocal8Bit(local8BitArray.data());
cout << "UTF8String转为中文QString:" << gbkQStr.toLocal8Bit().constData() << endl;
std::string gbkStr = std::string(gbkQStr.toLocal8Bit().constData());

其中,代码中的UTF8String类型为std::string,编码方式为UTF-8,1-2行代码将std::string转化为了GBK编码的QString。如果要将GBK编码的QString转化为GBK编码的char*,需要用QString的toLocal8Bit().constData()方法,不能用toStdString().c_str()方法。

你可能感兴趣的:(C++,c++,开发语言)