標籤:blog http 使用 os io 檔案 資料 ar
- 本站文章除註明轉載外,均為本站原創或者翻譯。
- 本站文章歡迎各種形式的轉載,但請18歲以上的轉載者註明文章出處,尊重我的勞動,也尊重你的智商;
- 本站部分原創和翻譯文章提供markdown格式源碼,歡迎使用文章源碼進行轉載;
- 本文標題:修改Visual Studio Express 2012建立C++檔案編碼
- 本文連結:http://zengrong.net/post/1900.htm
2013-12-03 更新:增加關於UTF-8(BOM)的說明
我突然發現Visual Studio Express 2012(後簡稱為VS)建立的源檔案是cp936(GB2312)編碼,這個以後在Linux和Mac下面編譯起來可能會有麻煩。
初步解決
於是,我嘗試將已有項目中的檔案改成了UTF-8格式,並設定儲存格式為UTF-8,大概有這樣幾步:
- “工具-選項-環境-文檔-不能以字碼頁的編碼格式儲存資料時將文檔儲存為Unicode”
- “工具-選項-文字編輯器-常規-自動檢測不帶簽名的UTF-8編碼”
- 在檔案開啟的情況下,選擇“檔案-進階儲存選項”,設定編碼和行尾
- 在另存檔案的時候選擇“編碼儲存”
請原諒我使用中文描述介面,因為當時安裝VS的時候手賤選了簡中介面,然後無論如何都沒法安裝英文語言套件……
上面的1、2兩項好像沒什麼用,關鍵是第3項。
根據我的習慣,將編碼設定為“Unicode(UTF-8無簽名) – 字碼頁 65001”,將行尾設定為“Unix(LF)”。
然後測試儲存,再用Vim開啟檔案查看編碼,發現檔案確實儲存為UTF-8編碼了。
但是(什麼事情都有但是),當我重新開啟這個檔案的時候,重新查看“進階儲存選項”,發現編碼又變成了“簡體中文(GB2312)-字碼頁936”。
屆時維尼奧神馬!!!
第二步解決
我猜測,是由於VS無法識別不帶簽名的UTF-8編碼檔案造成的。
要將一個文字檔被作為UTF-8編碼對待,可能需要以下幾個條件(或者之一):
- 檔案中包含UTF-8簽名;
- 檔案中包含UTF-8編碼的字元(不能全是ASCII可以解釋的字元);
- 編輯器優先以UTF-8編碼來解析。
例如我對Vim的設定,就是將UTF-8偵測放在優先的位置。
那麼,讓我來驗證一下猜測是否正確。
在“進階儲存選項”中將編碼設定為“Unicode(UTF-8帶簽名) – 字碼頁 65001”,然後儲存。重新開啟,編碼沒有變化。
這說明我的猜測是正確的。
那麼,再來驗證一下上麵條件的第2項是否正確。
在“進階儲存選項”中將編碼設定為“Unicode(UTF-8無簽名) – 字碼頁 65001”,加入一些中文內容,然後儲存。重新開啟,編碼沒有變化。
那麼,現在我可以斷定,VS可以正常識別UTF-8編碼,但我需要滿足上面的條件1或者2。
需要注意的是,即使是已有的項目中,所有檔案都已經是UTF-8編碼(例如cocos2d-x的項目模版),但使用VS開啟並進行儲存後,原來的檔案編碼都會變成CP936。這是因為原來的模版檔案中的檔案是UTF-8(無簽名)的。至於解決方案,參考上面了。
建立C++檔案的編碼
修改下面這幾個模版檔案的編碼和行尾值,在VS中建立的cpp或者h檔案,預設就是UTF-8編碼了(路徑自己改):
- c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\VCProjectItems_WDExpress\newc++file.cpp
- c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\VCProjectItems_WDExpress\hfile.h
- c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\VCNewItems_WDExpress\newc++file.cpp
- c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\VCNewItems_WDExpress\hfile.h
這些檔案預設都是0位元組的空檔案,因此建議在其中加入一些注釋,並將檔案編碼設定為UTF-8(帶簽名),行尾設定為Unix格式即可。
如果希望修改更多的東西,比如wizard之類的,可以看看這篇文章:VS2008中自訂C++工程模板與修改建立檔案預設編碼的辦法
最後的問題
這種修改預設檔案模版為 UTF-8(帶簽名) 的方法,其實是不被推薦的,原因是這本來是微軟一廂情願的做法。而我們的項目本來就應該跨平台,這種檔案在Mac平台下編譯,可能會有問題。
詳見這篇:「帶 BOM 的 UTF-8」和「無 BOM 的 UTF-8」有什麼區別?網頁代碼一般使用哪個?
但是,由於我 使用Eclipse+CDT開發Cocos2d-x(不用Visual Studio) 的嘗試失敗了,所以好像只能被迫接受這種現象了。
關聯文章
- 在Visual Studio Express 2012中建立一個cocos2d-x的win32項目
- Flash Builder安裝和卸載錯誤的解決辦法
- [譯]升級Flash Builder 4.7中的AIR SDK
- Cocos2d-x VS2012 HelloCpp調試
- 用swfobject實現FlashPlayer8的快速安裝(Express Install)