3 回答

TA貢獻1775條經(jīng)驗 獲得超11個贊
用C ++進行編碼相當復雜。這是我對此的理解。
每個實現(xiàn)都必須支持基本源字符集中的字符。這些包括§2.2/ 1(C ++ 11中的§2.3/ 1)中列出的常見字符。這些字符都應(yīng)該合而為一char。此外,實現(xiàn)還必須支持一種使用名為universal-character-names和\uffff或的方式來命名其他字符的方法,\Uffffffff并且可以用來引用Unicode字符。它們的一個子集可用于標識符(在附錄E中列出)。
一切都很好,但是從文件中的字符到源字符(在編譯時使用)的映射是實現(xiàn)定義的。這構(gòu)成了所使用的編碼。這是它的字面意思(C ++ 98版):
必要時,以實現(xiàn)定義的方式將物理源文件字符映射到基本源字符集(為行尾指示符引入換行符)。Trigraph序列(2.3)替換為相應(yīng)的單字符內(nèi)部表示形式?;驹醋址?.2)中未包含的任何源文件字符都將替換為指定該字符的通用字符名稱。(一個實現(xiàn)可以使用任何內(nèi)部編碼,只要處理在源文件中遇到的實際擴展字符,以及在源文件中表示為通用字符名稱的相同擴展字符(即,使用\ uXXXX表示法)等同地。)
對于gcc,您可以使用選項進行更改-finput-charset=charset。此外,您可以在運行時更改用于重新設(shè)置值的執(zhí)行字符。正確的選項是-fexec-charset=charsetchar(默認為utf-8)和-fwide-exec-charset=charset(默認為utf-16或utf-32取決于大小wchar_t)。

TA貢獻2036條經(jīng)驗 獲得超8個贊
除了litb的帖子,MSVC ++也支持Unicode。我了解它從BOM表獲取Unicode編碼。它絕對支持諸如int (*?)();或的代碼,const std::set<int> ?; 如果您真的對代碼感到迷惑:
typedef void ?; // Also known as \u203C
class oo? {
operator ?() {}
};

TA貢獻1833條經(jīng)驗 獲得超4個贊
據(jù)我所知,C ++標準未提及源代碼文件編碼。
通常的編碼是(或曾經(jīng)是)7位ASCII-一些編譯器(例如,Borland的編碼器)會討厭使用高位的ASCII字符。如果您的編譯器和編輯器接受Unicode字符,則沒有技術(shù)上的理由,因為大多數(shù)基于Linux的現(xiàn)代工具以及許多基于Windows的更好的編輯器都可以毫無問題地處理UTF-8編碼。我不確定微軟的編譯器會。
編輯:看起來微軟的編譯器將接受Unicode編碼的文件,但有時也會在8位ASCII上產(chǎn)生錯誤:
warning C4819: The file contains a character that cannot be represented
in the current code page (932). Save the file in Unicode format to prevent
data loss.
- 3 回答
- 0 關(guān)注
- 554 瀏覽
添加回答
舉報