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

文章讲述了在开发名为SmartPipe的软件时遇到的问题,即当弯管零件的名称为中文时,.ybc和.xyz文件导出的名称显示为乱码。问题源于C++的编码处理,特别是在UTF-8和GBK编码间的转换。作者提供了使用WindowsAPI的MultiByteToWideChar和WideCharToMultiByte函数以及QT的QString进行编码转换的解决方案。
摘要由CSDN通过智能技术生成

一、问题来源

我开发的软件SmartPipe已经在弯管生产中开始使用,有客户反馈,如果弯管零件的名称为中文的时候,自动导出的.ybc文件和.xyz文件名称为乱码,如图所示,于是为了解决这个问题,开展了一番研究。
图1 YBC文件中文名称乱码

二、背景知识

首先需要明确的是,在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()方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Windows 中,`PostMessage` 函数可以使用 `LPARAM` 参数来传递字符串等数据。如果需要将 `LPARAM` 参数中的字符转换为 `QString`,可以使用以下代码: ```cpp LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_MY_MESSAGE: { // 将 LPARAM 参数转换字符串 const char* str = reinterpret_cast<const char*>(lParam); // 将字符转换QString QString qstr = QString::fromUtf8(str); // 处理 QString // ... return 0; } // ... } return DefWindowProc(hwnd, msg, wParam, lParam); } ``` 在这个例子中,首先将 `LPARAM` 参数转换为 `const char*` 类型的字符串,然后使用 `QString::fromUtf8` 函数将字符转换为 `QString` 类型。需要注意的是,这里使用了 `fromUtf8` 函数,因为在 Windows 中,通常使用的是 UTF-8 编码的字符串。 另外,如果你在 `PostMessage` 函数中传递的是 Unicode 字符串,可以使用 `QString::fromWCharArray` 函数将 `LPARAM` 参数中的字符转换为 `QString`。例如: ```cpp LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_MY_MESSAGE: { // 将 LPARAM 参数转换为 Unicode 字符串 const wchar_t* wstr = reinterpret_cast<const wchar_t*>(lParam); // 将 Unicode 字符转换QString QString qstr = QString::fromWCharArray(wstr); // 处理 QString // ... return 0; } // ... } return DefWindowProc(hwnd, msg, wParam, lParam); } ``` 需要注意的是,在使用 `fromWCharArray` 函数时,需要将 `LPARAM` 参数中的字符转换为 `const wchar_t*` 类型的 Unicode 字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值