標籤:
最近把公司程式碼程式庫裡的代碼同步下來之後編譯了下,竟然出問題。問下同事說程式碼程式庫肯定沒問題,而我啥也沒改,那到底那裡出問題了呢?
VS2018報的錯誤是:error RC2001: newline in constant
百度下這個錯誤的原因,主要原因是定義的字串常量兩個引號之間有換行,跳到相應出錯的代碼位置處,大體可以解決這個編譯錯誤。當然,這個問題只是表象。由於程式碼程式庫裡的代碼編譯肯定能通過,而且這些代碼已經跑了很久了,不可能存在這麼低級的編譯問題。
那麼問題出在哪呢?
答案是作業系統的設定。問題源自於windows本身的一個曆史包袱吧,我大體簡述下,自己對這個問題本身研究也不透徹,所以有問題請諒解:大體就是windows在支援國際化的道路上是推薦使用unicode的,畢竟一個編碼通訊協定就能支援這個世界上所有語言的所有文字,也就不存在亂碼之類的問題了。但是windows也是半路才支援unicode的,在這之前一直是使用locale+ANSI編碼通訊協定的。這個是個什麼玩意兒呢?大體就是可以通過控制台裡的一個選項來設定系統的locale,而系統會根據你的locale來選擇在ANSI編碼(嚴格說這個不能叫編碼!!)模式下(相對於unicode而言,也就是文字編輯器如notepad++、VS的編輯器等檢測到當前的文字檔的編碼不是unicode)所使用的編碼。比如如果locale是Chinese PRC,則此時ANSI編碼為gb2312(或者gbk,反正是gb系的),而如果locale是English US的話,則ANSI編碼對應擴充的ascii(貌似,沒有求證)。說實話ANSI這個叫法著實蛋疼,很讓人費解,因為ANSI本身是個標準委員會,不明就裡的人根本不知道是說啥麼。
回到剛剛的編譯問題,由於這些代碼通常實在locale為English US的情況下編譯的,而代碼檔案本身不是unicode編碼,所以就應該是使用擴充ascii來進行編碼/解碼。但由於我的locale是Chinese PRC,所以對於非unicode編碼的檔案系統是使用gb2312來解析的。嗯嗯,問題來了,檔案的編碼和解碼所使用的標準不相容,導致各種詭異問題。
這裡想吐槽下微軟在處理這種問題下遺留下的種種尾巴,不過咋說呢,問題本身太複雜,解決不好也不怪這樣臃腫的大公司,誰還沒有點頑疾呢。
關於編碼的問題知乎上有討論:
http://www.zhihu.com/question/20650946
可以參考下,可能講的比我清楚。
另外,關於locale對應的ANSI編碼,微軟是叫code page的。locale與code page的對應可以參見:
http://www.science.co.il/language/Locale-Codes.asp?s=codepage
http://blog.csdn.net/whygosofar/article/details/4344252
沒時間瞭解太多,有問題請諒解。
關於windows系統裡locale、code page、ANSI編碼的問題