Qt5_vs2013_error_C2001: 常量中有換行符__資料

ZC: Win7x64 + Qt551(x86) + vs2013(x86)php

ZC: 問題:UTF-8 在源碼文件中有中文時,有時會報編譯錯誤:C2001 & C2143html

  分析:編輯器

  --> 因而,須要將源碼文件 保存成「UTF-8 + BOM」格式函數

  --> 「UTF-8 + BOM」格式,自VS2005開始,字符串的編碼方式 會轉換成系統默認的編碼方式 不必定與源碼文件的編碼方式相同...工具

  --> 「UTF-8 + BOM」格式的源碼中的 中文字符串 須要作特殊處理學習

ZC: 處理方式:this

  (1)、u8前綴 ==> VS2015纔開始支持編碼

  (2)、使用 相關函數,對字符串 進行轉換 (這也有 兩種方式:[A]、使用WindowsAPI函數進行轉換,[B]、使用Qt的函數進行轉換)spa

  (3)、在文件開頭須要使用漢字的地方,通常是CPP文件的開始處,加上這句「#pragma execution_character_set("utf-8")」,這是告訴vs編譯器,我們要使用UTF-8了.net

 

 

 

一、vs2010 error C2001: 常量中有換行符 (http://blog.csdn.net/bytxl/article/details/46046513)

在XCODE那邊寫的代碼,在window上編譯常常會出現  
vs2010 error C2001: 常量中有換行符
緣由:中文字符
很是奇怪的是隻有部分中文會提示。
GOOGLE了下發現如下幾種解決方案:
I 不用中文 -_-
II 偶數中文 或 結尾加英文的符號,如"."
III 字符轉換 GBKToUTF8
參考:
http://www.cocoachina.com/bbs/read.php?tid=96304
http://blog.sina.com.cn/s/blog_7a25340e01011l4f.html

目前採用第二種方案,由於String未來確定要移到配置文件裏去的。如Android的string.xml

2013.6.25 緣由: 非BOM的UTF-8格式 http://www.cnblogs.com/cocos2d-x/archive/2012/02/26/2368873.html 解決方案 中文放到string.xml裏去 詳情參見 LabelTest.cpp 的 BMFontUnicode方法 [cpp] view plaincopy CCDictionary *strings = CCDictionary::createWithContentsOfFile("fonts/strings.xml"); const char *chinese = ((CCString*)strings->objectForKey("chinese1"))->m_sString.c_str(); const char *japanese = ((CCString*)strings->objectForKey("japanese"))->m_sString.c_str(); const char *spanish = ((CCString*)strings->objectForKey("spanish"))->m_sString.c_str(); http://blog.csdn.net/xpwang168/article/details/8706810

  1.一、cocos2d-x中文顯示問題 (http://www.cnblogs.com/cocos2d-x/archive/2012/02/26/2368873.html

很高興你來到個人博客,同時也要感謝你對cocos2d-x引擎的支持。不過,既然你在這個時候來到這裏,那八成是由於你遇到了麻煩——在你的cocos2d-x應用中,中文的顯示彷佛不太正常。

雖然cocos2d-x是一個跨平臺的2D遊戲引擎,可是目前我只使用VC在Win32平臺下學習她。若是你是在其餘平臺上作開發,那麼這篇文章對你可能沒有太大幫助,我建議你閱讀cocos2d-x的代碼,找出問題的關鍵,從而定製一個可行的解決方案。

做爲一名初學者,你一定像我同樣跟着教程將代碼敲進編輯器裏,保存,編譯,運行。卻驚奇地發現中文字符串要麼不顯示了,要麼顯示成了亂碼。內心想着,天啊,什麼地方出問題了。而後打開百度、谷歌,搜索「cocos2d-x 中文」。因而你找到了解決方案,要把文件保存爲「無簽名的UTF-8」編碼。
按照上面的方法操做,編譯,運行,這時你已經能夠看到中文字符顯示正常了。若是你還有別的什麼重要的事情要作,沒有時間聽我在這裏廢話,那麼你如今就能夠點擊窗口上的叉叉離開了。

。。。。。。
咳咳。。。

你還在這裏?你還想聽聽爲何會這樣嗎?
額。。。好吧,那我就簡單說一下。以建立一個label爲例,當咱們使用
CCLabelTTF * CCLabelTTF::labelWithString(const char *label, const char *fontName, float fontSize)
來建立label的時候,實際上這裏的const char *參數指望的是UTF-8編碼的字符串(你能夠查看CCImage_win32.cpp中BitmapDC的drawText函數來印證個人說法),若是傳入一個非UTF-8編碼的字符串,那麼建立的label就會顯示得不太正常。
注意,這裏所說的傳入參數的編碼是指程序運行時傳入的字符串的編碼,而不是源文件保存的編碼。這其實是一個編譯器相關的問題,具體狀況你能夠經過這篇文章瞭解一下。http://blog.csdn.net/darkdong/article/details/6067119
簡單來講,若是你使用2005/2008/2010版的VC作開發,但願將UTF-8編碼的字符串硬編碼到源代碼中,而且不使用轉義字符"\xE6\xB1\x89"這種缺少可讀性的方案,那麼你必須將文件保存爲「無簽名的UTF-8」編碼。

然而在VC上使用「無簽名的UTF-8」編碼保存代碼文件是有毒反作用的。有興趣的朋友能夠跟我一塊兒作個實驗。
新建一個「Win32 控制檯應用程序」,而後添加以下代碼:

複製代碼
1 #include "stdafx.h"
2
3 int _tmain(int argc, _TCHAR* argv[])
4 {
5 const char str[] = "退出";
6 return 0;
7 }
複製代碼

而後將文件保存爲「無簽名的UTF-8」編碼,編譯。

我用的是Microsoft Visual C++ 2010 學習版,輸出:

複製代碼
1>------ 已啓動所有從新生成: 項目: utf-8-test, 配置: Debug Win32 ------
1> stdafx.cpp
1> utf-8-test.cpp
1>d:\projects\utf-8-test\utf-8-test.cpp : warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存爲 Unicode 格式以防止數據丟失
1>d:\projects\utf-8-test\utf-8-test.cpp(8): error C2001: 常量中有換行符
1>d:\projects\utf-8-test\utf-8-test.cpp(9): error C2143: 語法錯誤 : 缺乏「;」(在「return」的前面)
========== 所有從新生成: 成功 0 個,失敗 1 個,跳過 0 個 ==========
複製代碼

有個叫wva的人遇到過相似問題,他向微軟提交了此bug
http://connect.microsoft.com/VisualStudio/feedback/details/341454/compile-error-with-source-file-containing-utf8-strings-in-cjk-system-locale
根據Visual C++ Compiler Team員工的解釋:
The compiler when faced with a source file that does not have a BOM the compiler reads ahead a certain distance into the file to see if it can detect any Unicode characters - it specifically looks for UTF-16 and UTF-16BE - if it doesn't find either then it assumes that it has MBCS. I suspect that in this case that in this case it falls back to MBCS and this is what is causing the problem.
看見了吧,對於那些沒有BOM的文件設計就是這樣的。從語氣上看,他們編譯器小組也不打算修改設計。因此呢,在VC上使用「無簽名的UTF-8」編碼的文件,你就是在抱着一顆不定時炸彈玩耍。由於你永遠都不敢肯定哪些詞能經過編譯,哪些不能!

若是要硬編碼字符串,即使是字符編碼轉換也不必定能幫不上你。一旦你爲此增長了字符編碼轉換的代碼,那麼也意味着可移植性下降了。由於這從根本上是編譯器決定的。
因此若是你想要在你的cocos2d-x應用裏使用中文,那麼最好將它們存放到外部資源文件中去,而後提供一套文本資源獲取接口。
或者你僅僅是想像我同樣快點兒開始cocos2d-x引擎的學習,那麼暫時放棄中文吧,應該能省下很多時間。

 

二、Qt5與Qt4差異:在Qt5中QTextCodec中的setCodecForTr等消失了 (http://blog.sina.com.cn/s/blog_bb3b5c230102uxen.html

本文轉載轉載自:http://blog.csdn.net/dbzhang800/article/details/7325698

該片博主痛批了那些濫用QTextCodec,雖然我仍是不懂在看霍亞飛大俠寫的基於Qt4.7.2和Qt Creator2.1.0版本《Qt Creator快速入門》中,霍大俠開篇就提醒我,國際化很重要,有中文要轉碼在主函數中要加上:

QTextCodec::setCodecForTr(QTextCodec::codecForLocal());

QTextCodec::setCodecForTr(QTextCodec::codecRForName("GB18030"));

QTextCodec::setCodecForCString(QTextCodec::codecForLocal());

我也不懂,Qt5編譯不了,我就直接屏蔽了!

可是在編譯書中源代碼是就很頭疼,不少錯誤!

 

 下面是本人總結的由Qt4轉到Qt5的一些解決方法

 

原來是Qt4與Qt5版本有很大的差異,首先使用了widget的你在都要在.pro項目文件中加入一句:

QT       += widgets

而且main.cpp的頭文件

#include 要改爲   #include

 

而後是QTextCodec::setCodecForTr( )函數沒有了,沒有我就刪掉你!

差很少了,基本上的程序都能運行。

但到後面界面出現中文就亂碼,搞了半天也沒懂!

找到這篇博文後我覺得找到福星,可以拯救我!

但還不夠,我太菜了,這樣高大上的文章我看不懂大俠啊!

通過摸索後,修改了下大俠的博客,讓咱們這些菜鳥可以直接使用,直接解決問題!

修改原文以下!

在Qt4中,國內不少新手都喜歡——不分青紅皁白地使用以下3行代碼

 

QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCStrings(...)
QTextCodec::setCodecForLocale(...)

儘管以前零零散散寫過一點這方面的內容,好比

可是,敢死隊員仍是一批一批的 ... 讓人少多有些無奈

癥結?

在國內,之因此用不少人用這3行代碼,是由於他們在源代碼的const char*這種窄字符串中使用了中文。

而後,發現。不對啊,咋全是亂碼呢?因而上網搜索,發現其餘人用的這3行代碼

因而,加上試試。發現:在本身的當前環境下(固定系統、固定地區語言設置、固定編譯環境)還真的沒有亂碼了。

因而乎?徹底不考慮那3行代碼的做用了,反正本身能用就好了,管它什麼反作用呢!!

Qt5

在Qt5中,這個問題終於不復存在了,由於

這兩個函數

QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCStrings(...)

被直接去掉了。

這樣一來,受影響的直接是以下代碼了:

QString s1 = "我是中文";
QString s2("我是中文");
QString s3 = QObject::tr("我是中文")

好消息/壞消息?

  • 壞消息

如今Qt5中儘管去掉了setCodecXXX這兩個函數,可是默認編碼仍是latin1。若是你要想使用

"我是中文"

這樣的字符串,必須本身使用QTextCodec或這QString::fromXXX 這種東西進行轉換

 

這裏擴展一下如何使用QTextCodec或這QString::fromXXX 這種東西進行轉換

一、QTextCodec *codec = QTextCodec::codecForName("GB2312");//或者是GB18030
   label->setText(codec->toUnicode("我是中文"));

  二、 label->setText(QString::fromLocal8Bit("我是中文"));

關於文字編碼方式、編碼表、編碼器等相關內容能夠Google或者百度去了解。

  • 好消息 是:

Qt5發佈之時,默認將會是utf8編碼,徹底能夠將你從Qt編碼問題解放出來。

  • 壞消息,若是使用的是 MSVC2005/2008/2010,可能沒法使用utf8編碼,因而

下面的代碼

QString s1 = "我是中文";
QString s2("我是中文");
QString s3 = QObject::tr("我是中文")

將不會工做。

  • 由於從MSVC2005起,你沒法給編譯器設置字符串要使用的編碼。儘管2003以前,也沒法設置,可是它會遵循源碼文件的編碼。而2005就自做聰明瞭,即便你源碼文件保存成不帶BOM的utf8,它都會試圖幫你轉換一下。
  • 好消息是什麼呢?

若是你在Windows下,且使用的是MinGW,那麼只要你將源碼文件保存成utf8,前面的代碼將直接能夠工做(無須其餘設置)

若是你在其餘平臺了,那麼應該都默認是utf8文件。一樣無須進行設置。

  • 好消息

若是你的編譯器支持C++11,那麼,你能夠直接使用

 

QString s = u8"我是中文";
  • 壞消息

主流編譯器還都不怎麼支持C++11

參考

 

三、QT5.6.0+vs2015源碼中含有中文的解決辦法  http://www.qtcn.org/bbs/read-htm-tid-60825.html

默認是UTF-8無BOM
而後編譯的時候,漢字的數量偶數就能夠,奇數不行,編譯都不過
用了GBK後能夠編輯,但顯示不正常
後來用的這種方法:
一、將文件編碼轉爲UTF-8有BOM的,這裏推薦工具editplus,能夠批量轉化
二、在文件開頭須要使用漢字的地方,通常是CPP文件的開始處,加上這句「#pragma execution_character_set("utf-8")」,
      這是告訴vs編譯器,我們要使用UTF-8了

 

四、

五、

相關文章
相關標籤/搜索