2010-09-22 18 views
10

該標準定義字符集 - 不明確

  • 基本源字符集

  • 基本執行字符集及其寬字符對應

它還定義「執行字符集'及其寬字符對應如下

$ 2.2/3-「執行字符集 和執行寬字符集 分別是基本執行 字符集和基本執行 寬字符集的超集。執行 字符集的成員的 值 實現定義,以及任何額外 成員 區域設置特定的「。

Q1。我不認爲我明白這一點完全,特別是最後一條語句在這方面的任何指針

此外,

$ 3.9.1 - ?聲明 字符(字符)」的對象應是大 足以存儲 實現的基本字符集的任何成員。「

Q2。 3.9.1短語'基本字符集'是指'基本執行字符集'?

回答

16

你需要做的源代碼字符集,執行字符集,線材執行字符集之間的區別,它的基本版本:

基本源字符集:

§2.1。 1:基本源字符集由96個字符組成[012]

該字符集恰好有96個字符。它們適合7位。不包括@等字符。

讓我們來看幾個基本源字符的二進制表示。它們可以是完全任意的,並且不需要這些對應於ASCII值。

A -> 0000000 
B -> 0100100 
C -> 0011101 

基本執行字符集...

§2.1.3:基本執行字符集和基本執行寬字符集應分別包含基本源字符的所有成員設置,加上代表alert,backspace和回車的控制字符,加上一個空字符(分別爲空寬字符),其表示全部爲零。

如前所述,基本執行字符集包含基本源字符集的所有成員。它仍然不包含任何其他字符,如@。基本執行字符集可以具有不同的二進制表示。

如前所述,基本執行字符集包含回車符,空字符和其他字符的表示。

A   -> 10110101010 
B   -> 00001000101 <- basic source character set 
C   -> 10101011111 
---------------------------------------------------------- 
null  -> 00000000000 
Backspace -> 11111100011 

如果基本執行字符集是11位長(如在這個例子中)char數據類型應足夠大,以存儲11位,但它可能會更長。

...和基本執行寬字符集:

基本執行寬字符被用於寬字符(wchar_t的)。它基本上與基本執行寬字符集相同,但也可以具有不同的二進制表示形式。

A   -> 1011010101010110101010 
B   -> 0000100010110101011111 <- basic source character set 
C   -> 1010100101101000011011 
--------------------------------------------------------------------- 
null  -> 0000000000000000000000 
Backspace -> 1111110001100000000001 

唯一固定構件是一個空字符,其需要成爲0位的序列。

基本字符間的轉換集:

§2.1.1.5:每個源字符集成員,轉義序列,或通用字符名稱在字符文字和字符串被轉換爲一個構件執行字符集(2.13.2,2.13.4)。

然後,C++源文件編譯源代碼字符集的每個字符被轉換爲基本執行(寬)的字符集。

實施例:

const char* string0 = "BA\bC"; 
const wchar_t string1 = L"BA\bC"; 

由於string0是一個正常字符它將被轉換到基本執行字符集和string1將被轉換爲基本執行寬字符集。

string0 -> 00001000101 10110101010 11111100011 10101011111 
string1 -> 0000100010110101011111 1011010101010110101010 // continued 
      1111110001100000000001 1010100101101000011011 

一些關於文件編碼:

有幾種文件編碼。例如,長度爲7位的ASCIIWindows-1252這是8位長(稱爲ANSI)。 ASCII不包含非英文字符。 ANSI包含一些歐洲字符,如ä Ö ä Õ ø

較新的文件編碼,如UTF-8UTF-32可以包含任何語言的字符。 UTF-8是字符長度可變。 UTF-32是32位字符長。

文件enconding要求:

大多數編譯器提供命令行開關來指定源文件的文件編碼。

一個C++源文件需要用文件編碼進行編碼,該文件編碼具有基本源字符集的表示形式。例如:源文件的文件編碼需要具有;字符的表示形式。

如果您可以在選擇的編碼中輸入字符;作爲源文件的編碼,該編碼不適合作爲C++源文件編碼。

非基本字符集:不包含在基本源字符集

文字屬於源代碼字符集。源字符集等同於文件編碼。

例如:@字符不包含在基本源字符中,但可能包含在源字符集中。所選文件的輸入源文件編碼可能包含@的表示。如果它不包含@的表示形式,則不能在字符串內使用字符@

不包含在基本(寬)字符集中的字符屬於執行(寬)字符集。

請記住,編譯器將字符從源字符集轉換爲執行字符集和執行寬字符集。因此需要有辦法如何轉換這些字符。

例如:如果指定Windows-1252作爲源字符集編碼,並指定ASCII作爲執行寬字符集是沒有辦法這個字符串轉換:

const char* string0 = "string with European characters ö, Ä, ô, Ð."; 

這些字符無法表示在ASCII

指定字符集:

這裏有一些例子,說明如何指定使用gcc的字符集。包含默認值。

-finput-charset=UTF-8   <- source character set 
-fexec-charset=UTF-8   <- execution character set 
-fwide-exec-charset=UTF-32 <- execution wide character set 

使用UTF-8和UTF-32作爲默認編碼C++源文件可以包含與任何語言的字符的字符串。 UTF-8字符可以兩種方式轉換而沒有問題。

擴展字符集:

§1.1.3:多字節字符,表示所述擴展字符集源或執行環境中的一個成員的一個或多個字節組成的序列。擴展字符集是基本字符集(2.2)的超集。

多字節字符比正常字符的條目長。它們包含一個轉義序列,將它們標記爲多字節字符。

多字節字符是根據用戶運行環境中設置的區域設置進行處理的。這些多字節字符在運行時會轉換爲用戶環境中設置的編碼。

+1

這句話有點難以遵循:「如果可以鍵入字符;在編碼中選擇編碼作爲源文件的編碼,那麼編碼不適合作爲C++源文件編碼。」這是什麼意思? – JCx 2014-12-29 23:04:07

+0

我認爲'-fexec-charset = UTF-8'是一個不好的例子,因爲它不符合標準。這個想法很清楚:_basic執行字符集_應該是Unicode,但是(正如你自己突出顯示的那樣)'char'應該是20位寬以保存所有的Unicode值。然而'UTF-8'是一種可變長度編碼,這意味着它只適用於_extended字符集_。 – MSalters 2015-04-01 14:34:35