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, , _pMB, -, NULL, );
wchar_t* pWC = new wchar_t[iWidecharLen + ];
memset(pWC, , (iWidecharLen + ) * sizeof(wchar_t));
::MultiByteToWideChar(_iEncoding, , _pMB, -, (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, , _pWC, -, NULL, , NULL, NULL);
char *pMB = new char[iMultibyteLen + ];
memset(pMB, , (iMultibyteLen + ) * sizeof(char));
::WideCharToMultiByte(_iEncoding, , _pWC, , 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(, 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(), );
pc01 ++;
} // *** *** *** *** *** ***
qDebug() << ""; QTextCodec *codec = QTextCodec::codecForName("GBK");
QString str = codec->toUnicode("本地连接");
pc01 = (QChar*)str.unicode();
while ((*pc01) != '\0')
{
qDebug() << QString::number((int)(*pc01).unicode(), );
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、
Qt5_vs2013_error_C2001: 常量中有换行符__ZC的更多相关文章
- Qt5_vs2013_error_C2001: 常量中有换行符__资料
ZC: Win7x64 + Qt551(x86) + vs2013(x86) ZC: 问题:UTF-8 在源码文件中有中文时,有时会报编译错误:C2001 & C2143 分析: --> ...
- Visual Studio error C2001:常量中有换行符(解决办法)
在Visual Studio自动生成的项目中,碰见了一件关于文件编码的问题,集中在类似于以下的语句上: DASLog (DASProtWarn, L"(%s)消息超时,进入慢循环召唤模式.& ...
- Qt && 常量中有换行符 && 中文
[1]VS + QT开发环境,中文内容编译时提示错误error C2001:常量中有换行符 解决方案:VC的编译器,把代码格式改为带BOM的UTF8就好了 建议步骤: (1)用Notepad++打开c ...
- VS2017.常量中有换行符
1.VS中加入 “/utf-8” Qt中 也是加入“/utf-8”,加的地方注意下:在 pro文件中 ,这个位置加入: win32-msvc*:QMAKE_CXXFLAGS += /wd"4 ...
- QT Creator有中文出现“常量中有换行符 ”的解决办法
QT Creator有中文出现“常量中有换行符 ”的解决办法 QT Creator在QT5.9下报错“常量中有换行符 ”,我的代码中有中文,而且在Windows 10下用微软VS编译器编译.造成这个报 ...
- 应对 Visual Stdio 编译时出现错误:常量中有换行符
笔者最近用 Visual Stdio 时,发现一个问题,在某一次写完语言进行编绎运行时,出现了以下错误: C2001错误:变量中有换行符 C2413错误:语法错误 缺少")"(在& ...
- 关于 error C2001: 常量中有换行符
看过之后,还是有所收获的,先mark一下 原链接: http://www.cnblogs.com/cocos2d-x/archive/2012/02/26/2368873.html#commentfo ...
- Qt乱码解决办法(常量中有换行符)
用记事本打开源代码,然后点另存为,utf-8,编码覆盖 QStringLiteral("打开相机")
- SQLLoader8(加载的数据中有换行符处理方法)
SQLLDR加载的数据中有换行符处理方法1.创建测试表: CREATE TABLE MANAGER( MGRNO NUMBER, MNAME ), JOB ), REMARK ) ); 2.创建控制文 ...
随机推荐
- a Javascript library for training Deep Learning models
w强化算法和数学,来迎接机器学习.神经网络. http://cs.stanford.edu/people/karpathy/convnetjs/ ConvNetJS is a Javascript l ...
- 洛谷P2325王室联邦 SCOI2005 构造+树上分块
正解:构造 解题报告: 照例先放传送门 umm其实我jio得这题应该在教树上莫队的时候港,应该是用来帮助理解树上莫队的分块方式的 然而这题是在学了树上分块之后再遇到的?就显得没那么难了吼 然后就随便说 ...
- Instagram 架构分析笔记(转)
原文:http://dbanotes.net/?s=Instagram+%E6%9E%B6%E6%9E%84%E5%88%86%E6%9E%90%E7%AC%94%E8%AE%B0 作者:冯大辉 In ...
- java:判断二进制数据中第n位是否为1
可以使用位运算来判断. &是位的与运算符,是指二进制数按位“与”的操作, 逻辑与就是两者都为真的时候才为真,其他真假,假真,假假的运算结果都是假.二进制写法如下 1 & 1 = 1 , ...
- linux创建新用户后shell无法自动补全命令或使用基本的shell命令
新建一用户lqding,切换到该用户下 root@lqding:~# su - lqding$$ echo $USERlqding$ ^[[A 提示符仅仅是一个$,很奇怪.输入命令,用TAB键也无法补 ...
- python16_day27【crm 内嵌、删除、action】
一.内嵌 二.删除及关联关联显示 三.action
- NULL头文件
#include<stddef.h> NULL不是C语言基本类型,其定义在stddef.h文件中,作为最基本的语言依赖宏存在.但是随着C/C++的发展,很多文件只要涉及了系统或者标准操作都 ...
- Bootstrap按钮组学习
简介 通过按钮组容器把一组按钮放在同一行里.通过与按钮插件联合使用,可以设置为单选框或多选框的样式和行为. 按钮组中的工具提示和弹出框需要特别的设置 当为 .btn-group 中的元素应用工具提示或 ...
- #C++初学记录(阶乘#递归)
练习题目三 用递归进行阶乘 运行代码 #include<iostream> using namespace std; int f(int n); int n; int main() { c ...
- Keras实践:模型可视化
Keras实践:模型可视化 安装Graphviz 官方网址为:http://www.graphviz.org/.我使用的是mac系统,所以我分享一下我使用时遇到的坑. Mac安装时在终端中执行: br ...