2013-05-02 28 views
1

引用集:執行字符集中字符的值是多少?從C++ 03 2.2字符

「的基本執行字符集和基本執行 寬字符集應各自包含基本 源字符set..The值的所有成員的執行成員 字符集是實現定義的,並且任何其他成員 都是特定於語言環境的。「

據此,'A'屬於執行字符集,其值是實現定義的。所以它不是65(十進制中的'A'的ASCII碼),什麼?!

// Not always 65? 
printf ("%d", 'A'); 

或者我有一個誤解爲值執行字符的字符的集?

+2

所以,如果你在一臺使用EBCDIC的機器上運行,你期望'char c ='A'; cout << c << endl;'輸出一個A或其他東西?在EBCDIC中,'A'的值爲193. – 2013-05-02 13:41:57

+2

只是好奇,但有沒有人看過除EBCDIC或ASCII擴展名以外的任何東西?在C或C++中:我熟悉C之前使用過的其他編碼,但我不認爲曾經有過使用它們的C編譯器。 (大多數最早的編碼並沒有完成大小寫,所以它們可能在6位上。) – 2013-05-02 13:44:44

+3

「A」的值是「A」。 – 2013-05-02 13:46:00

回答

5

當然,如果執行字符集是ASCII或超集(如UTF-8),它可以是ASCII碼65。

它不會說「它不能是ASCII」,它說它是所謂的「執行字符集」。

+0

所以我想比較'A'w/65或者將其ASCII碼寫入二進制文件既不方便,對吧? – 2013-05-02 14:16:19

+0

如果你有一個包含「raw」形式的二進制數據的文件,那麼它不是非常便攜。你需要知道排序和其他這樣的事情。如果你有一個文本文件是ASCII並且想在EBCDIC中使用它,那麼就有翻譯程序(例如unix/linux'dd')。 – 2013-05-02 14:28:42

+0

@Mats,開發人員比EBCDIC等ASCII對應方更熟悉Endianness;) – 2013-05-02 14:32:48

1

因此,該標準允許「執行字符集」是除ASCII或ASCII派生之外的其他內容。一個例子就是IBM長期使用的EBCDIC字符集(可能還有使用EBCDIC的機器,但我懷疑在過去的10 - 15年內建立的任何東西都不會使用它)。 EBCDIC中的字符編碼與ASCII完全不同。

因此,在代碼中,期望'A'的值是任何特定的值是不可移植的。還有一大堆其他「常見假設」會失敗--A-Z之間沒有「漏洞」,而'A' - 'a'== 32在EBCDIC中都是錯誤的。至少字符A-Z的順序是正確的! ;)

+0

IBM mainframces仍在使用EBCDIC今天。 (和FWIW:所有C和C++都需要的是10位數是連續的和按順序的,字母可以遍佈整個地方,如果是本地整理序列,那麼它將是相反的直覺,但是它已經是計數器了直觀的做法是將所有上面的整理內容放在任何較低的位置,並在它們之間留下一些奇怪的標點符號。更不用說在ISO 8859-1中使用重音字符時會發生什麼。) – 2013-05-02 14:43:28

+0

是的,但是每個IBM主機產生多少這幾天呢? – 2013-05-02 14:49:19

+0

像往常一樣多?從未有過大量的大型機;一開始,也沒有大量其他的東西。但是我知道一些仍然在大型機上處理大部分數據的地方。對於某些類型的工作,它仍然是首選解決方案。 – 2013-05-02 15:32:49