zoukankan      html  css  js  c++  java
  • 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) != '')
        {
            qDebug() << QString::number((int)(*pc01).unicode(), 16);
            pc01 ++;
        }
    
      // *** *** *** *** *** ***
        qDebug() << "";
    
        QTextCodec *codec = QTextCodec::codecForName("GBK");
        QString str = codec->toUnicode("本地连接");
        pc01 = (QChar*)str.unicode();
        while ((*pc01) != '')
        {
            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、

  • 相关阅读:
    sed cat 命令
    Datetime 时间模块求日期差
    Selenium:截图显示等待
    SAS常用函数
    SAS笔记
    python 简明教程 【转】
    numpy 笔记
    android Adapter使用详解
    Eclipse的使用技巧之eclipse里的查找:
    Hierarchy Viewer之官方文档翻译之中英对照之未完不续版之使用详解.
  • 原文地址:https://www.cnblogs.com/cppskill/p/6068394.html
Copyright © 2011-2022 走看看