Qt5_vs2013_error_C2001: 常量中有换行符__ZC
ZC: 这里是解决 Windows平台下的这个 编译error :“error C2001: 常量中有换行符”。
ZC: 我现在(20161221)的处理方式:vs2010或vs2015 将cpp文件保存为“UTF-8 + BOM”的格式。此时 编译是OK了,但是qDebug()输出的中文却是乱码了,需要转换:
//QTextCodec *codec = QTextCodec::codecForName("GB2312");//或者是GB18030 QTextCodec *codec = QTextCodec::codecForName("GBK"); QString str = codec->toUnicode("中文字符串");
ZC: 注意:
我将codec做成类成员变量来使用时,在编译到“codec->toUnicode(...)”时 始终会报错...
将上面2句代码放在一个函数中使用时,却是一切OK,不知为何...
1、处理该问题,3中方式:
(1)、C++11 的 u8前缀 (需要 vs2015)
(2)、Windows API 函数 处理 字符编码转换
(3)、Qt函数 处理 字符编码转换(也有两种处理方式,貌似 都蛮方便的...)
ZC: 个人偏向于 (1)/(3) 的做法,更为通用,也适合 跨平台 省的麻烦...
2、测试代码:(只是 测试对比了 (2)和(3),(1)还没有测试)
2.1、mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QMessageBox> #include <QTextCodec> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } // *** *** *** *** *** #include <windows.h> std::wstring Windows_MultiByte2WideChar(const char* _pMB, int _iEncoding = CP_ACP)//CP_UTF8 { int iWidecharLen = ::MultiByteToWideChar(_iEncoding, 0, _pMB, -1, NULL, 0); wchar_t* pWC = new wchar_t[iWidecharLen + 1]; memset(pWC, 0, (iWidecharLen + 1) * sizeof(wchar_t)); ::MultiByteToWideChar(_iEncoding, 0, _pMB, -1, (LPWSTR)pWC, iWidecharLen); std::wstring ws(pWC); delete[] pWC; return ws; } std::string Windows_WideChar2MultiByte(const wchar_t* _pWC, int _iEncoding = CP_ACP)//CP_UTF8 { int iMultibyteLen = ::WideCharToMultiByte(_iEncoding, 0, _pWC, -1, NULL, 0, NULL, NULL); char *pMB = new char[iMultibyteLen + 1]; memset(pMB, 0, (iMultibyteLen + 1) * sizeof(char)); ::WideCharToMultiByte(_iEncoding, 0, _pWC, 0, pMB, iMultibyteLen, NULL, NULL); std::string str(pMB); delete[] pMB; return str; } // 枚举 系统中所有可用的字符编码 void MainWindow::on_pbtnTest01_clicked() { QList<QByteArray> list = QTextCodec::availableCodecs(); foreach (QByteArray ba, list) { qDebug() << ba; } // *** *** *** QTextCodec* pTC = QTextCodec::codecForLocale(); QTextCodec* pTC01 = pTC->codecForName("UTF-8"); qDebug() << pTC->name(); qDebug() << pTC01->name(); } // ZC: Windows API 字符编码转换 // ZC: 貌似 使用WinAPI将ANSI转换为UTF-8的话,需要两步:(1)、ANSI==>WideChar,(2)、WideChar==>UTF-8 void MainWindow::on_pbtnTest02_clicked() { // http://blog.csdn.net/bytxl/article/details/46046513 //QMessageBox::warning(0, tr("警告"), tr("发送内容不能为空"), QMessageBox::Ok); const char *pcA = "警告"; std::wstring wstrA = Windows_MultiByte2WideChar(pcA); QString strA = QString::fromStdWString(wstrA); const char *pcB = "发送内容不能为空"; std::wstring wstrB = Windows_MultiByte2WideChar(pcB); QString strB = QString::fromStdWString(wstrB); QMessageBox::warning(0, strA, strB, QMessageBox::Ok); } // ZC: Qt函数处理 编码问题 --(1) void MainWindow::on_pbtnTest03_clicked() { // http://blog.sina.com.cn/s/blog_bb3b5c230102uxen.html //QTextCodec *codec = QTextCodec::codecForName("GB2312");//或者是GB18030 QTextCodec *codec = QTextCodec::codecForName("GBK"); QString str = codec->toUnicode("退出"); qDebug() << str; ui->pteMsg->appendPlainText(str); str = QString::fromLocal8Bit("退出"); qDebug() << str; ui->pteMsg->appendPlainText(str); ui->pteMsg->appendPlainText("退出"); qDebug() << "退出"; } // ZC: Qt函数处理 编码问题 --(2) void MainWindow::on_pbtnTest04_clicked() { // 设置 文本使用什么样的编码方式 (不设置的话,根据vs编译器的相关特性来决定是 何种编码方式) // ZC: setCodecForLocale一旦设置之后,程序后面的QString::fromLocal8Bit(...)编码设置就都改变了,直到再使用setCodecForLocale进行改变 // ZC: 测试下来 setCodecForLocale,只影响QString::fromLocal8Bit(...),不影响QString::fromUtf8(...) //QTextCodec::setCodecForLocale(QTextCodec::codecForLocale()); QTextCodec::setCodecForLocale(QTextCodec::codecForName("gbk"));// 中文版Windows,默认使用的就是GBK编码,∴这一句可以省略 QString str = QString::fromLocal8Bit("本地连接"); //QString str = QString::fromUtf8("本地连接");// 这一句代码的话,不管是?.cpp保存成“UTF-8”或是“UTF-8 + BOM”显示的都是乱码... qDebug() << str; qDebug() << ""; } // ZC: 对比 WinAPI编码转换 和 Qt函数编码转换 得到的字节流数据 是否一致 void MainWindow::on_pbtnTest05_clicked() { // QString str = QString::fromLocal8Bit("本地连接"); // qDebug() << str; //* std::wstring wstr = Windows_MultiByte2WideChar("本地连接"); QString str01 = QString::fromStdWString(wstr); QChar *pc01 = (QChar*)str01.unicode(); while ((*pc01) != '\0') { qDebug() << QString::number((int)(*pc01).unicode(), 16); pc01 ++; } // *** *** *** *** *** *** qDebug() << ""; QTextCodec *codec = QTextCodec::codecForName("GBK"); QString str = codec->toUnicode("本地连接"); pc01 = (QChar*)str.unicode(); while ((*pc01) != '\0') { qDebug() << QString::number((int)(*pc01).unicode(), 16); pc01 ++; } //*/ } void MainWindow::on_pbtnMsgClear_clicked() { ui->pteMsg->clear(); }
2.2、mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>604</width> <height>397</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralWidget"> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QPushButton" name="pbtnTest01"> <property name="text"> <string>枚举系统中所有可用的字符编码</string> </property> </widget> </item> <item row="0" column="1"> <widget class="QPushButton" name="pbtnTest02"> <property name="text"> <string>WinAPI处理字符编码转换</string> </property> </widget> </item> <item row="0" column="2"> <widget class="QPushButton" name="pbtnMsgClear"> <property name="text"> <string>清空消息</string> </property> </widget> </item> <item row="1" column="0"> <widget class="QPushButton" name="pbtnTest03"> <property name="text"> <string>Qt函数 处理编码转换(1)</string> </property> </widget> </item> <item row="1" column="1"> <widget class="QPushButton" name="pbtnTest04"> <property name="text"> <string>Qt函数 处理编码转换(2)</string> </property> </widget> </item> <item row="2" column="0" colspan="3"> <widget class="QPushButton" name="pbtnTest05"> <property name="text"> <string>对比 WinAPI编码转换 和 Qt函数编码转换得到的字节流数据是否一致</string> </property> </widget> </item> <item row="3" column="0" colspan="3"> <widget class="QPlainTextEdit" name="pteMsg"/> </item> </layout> </widget> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> </ui>
2.3、
3、