簡體   English   中英

C中putchar的字符集

[英]Charset of putchar in C

我試圖弄清楚putchar使用什么字符集。 看來,它不能打印多字節字符:

putchar('€') //gcc warning: multi-character character constant

但是,當使用chcp 1252將Windows中終端的代碼頁設置為1252(西歐拉丁語)時,以下代碼將能夠打印歐元符號:

putchar(128)

但是,即使終端的字符集設置為1252,putchar('€')也無法打印歐元符號。

有人可以向我解釋以上(似乎)差異嗎?

非常感謝你。

實際上,C中的char表示“字節”,而不是“字符”

您的源文件很可能使用UTF-8編碼,其中歐元符號編碼為以下3個字節:0xE2 0x82 0xAC。

顧名思義, putchar寫入單個字節。 C作為一種語言沒有“字符”或“編碼”的概念,默認情況下,GCC使用在源文件中找到的確切字節。 因此,在您的情況下,它將向標准輸出輸出字節0xAC( '€'的最低有效字節)。 在編輯器中看起來是什么樣子,或者文件應該是哪種編碼都沒有關系。 GCC不區分大小寫,它按原樣復制字節。

給定程序中的字節流,終端顯示的內容僅取決於該終端的設置。 如果要在Windows終端中顯示UTF-8編碼的文本,則應輸入chcp 65001並將字體更改為Lucida。

由於您的編輯器根據指定的編碼顯示字節,並且終端使用某種編碼顯示相同的字節,因此(只要您使用默認設置使用GCC或Clang),如果編輯器和終端使用相同的編碼,您應該看到兩個程序中的相同字符。

編輯:關於GCC如何處理編碼的一些評論:

有兩個選項: -finput-charset-fexec-charset 僅當這兩個選項相同時,GCC才會按字面意義處理狹義字符串和char文字中的字節。 如果不是,則GCC會將其從輸入編碼轉換為exec編碼。

經過一些測試,我得出的結論是,由於某種原因,您的GCC可以將Windows-1250作為輸入編碼,將UTF-8作為exec編碼運行。

如果要真正確定使用的是正確的編碼,請在編譯器選項中添加-finput-charset=cp1250 -fexec-charset=cp1250

同樣,如果需要,您可以通過這種方式使程序以控制台的默認編碼運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM