閒話字元編碼

2021-06-19 20:55:09 字數 1452 閱讀 7657

c原始檔本身是普通的文字檔案,既然是文字檔案,那他就有自己的字元編碼格式。

我們常用的大概是gbk、utf-8這兩種格式。

如果乙個utf-8格式的文字檔案,是用微軟的記事本程式建立的,那麼這個檔案的開頭會有3個位元組的utf-8簽名(ef bb bf),也叫做bom。

bom是個可選的東東,因此不是所有編輯器程式都會在檔案前面加上這東東。

有些程式不識別bom,把他當正常字元資料處理,就出錯了。

好了,接下來看看字元編碼對各種事情的影響。

一、c原始檔的編碼格式

gcc編譯c源**,預設採用utf-8編碼處理輸入的c原始檔。如果c原始檔編碼格式不是utf-8,則可以通過-finput-charset選項指出原始檔編碼格式。

否則的話,可能會導致編譯失敗。

例如,假如原始檔a.c是gbk格式,也可以通過如下命令編譯此檔案。

gcc -c  -finput-charset=gbk  a.c

當出現編譯失敗時,可以通過madedit這個文字編輯器開啟原始檔,看看他的編碼格式到底是什麼。

madedit工具非常好用,通過他可以手動切換編碼格式來解析文字檔案。

當我們看到顯示出的內容不再是亂碼時,就知道檔案的編碼格式了。

同時,通過選擇16進製制模式,還能看到每個字元的實際編碼值。

通過使用16進製制模式,加上手動切換編碼格式,我們甚至可以檢視目標檔案中的字串常量的值,及其編碼格式。

二、目標檔案中字串常量的編碼格式

不管c原始檔是什麼編碼格式,gcc生成的目標檔案中,對於字串常量的值,預設總是採用utf-8編碼。

當然,我們也可以通過編譯選項,指定生成的目標檔案中字串常量值的編碼格式。例如,通過如下命令,指定為gbk格式。

gcc -c  -fexec-charset=gbk  a.c 

通過 iconv --list ,可以檢視gcc支援的編碼格式。

三、程式執行時,輸入輸出涉及的編碼格式

程式執行時,通過printf向終端輸出一串字元。printf內部最終實際上是呼叫write系統呼叫,將字串資料到描述符1,描述符1即終端裝置。至於能否正常顯示,那就要看所寫字串的編碼格式與當前終端裝置支援的編碼格式是否一致了。

linux系統的終端,預設編碼格式可能是utf-8。

如果是通過securecrt連線到liux,那麼這就是偽終端。此時,write系統呼叫將字串資料通過socket連線發給了securecrt程式。此時,securecrt就是終端裝置。

printf語句,所輸出的字串,其值可能來自字串常量,可能來自文字檔案,可能來自網路。來自**不要緊,總之,要搞清楚資料來源的編碼格式。

四. windows與linux對拷檔案後,檔名亂碼問題

檔名、目錄名,也是文字,當然也有自己的編碼格式。

不過,這些文字資料,是屬於檔案系統的資料,歸檔案系統管理。

這裡的編碼策略,與檔案系統風格有關,與作業系統風格也有關,因此就難以說清了^_^

字元編碼 unicode編碼

1.ascii american standard code for information interchange 美國資訊交換標準 這是計算機上最早使用的通用的編碼方案。那個時候計算機還只是拉丁文本的專利,根本沒有想到現在計算機的發展勢頭,如果想到了,可能一開始就會使用unicode了。當時絕大...

A 字元編碼

請將一串長度為5的純字母文字譯成乙個密碼,密碼規律如下 用原來的字母後面的第4個字母代替原來的字母。如c用g代替 文字中不存在w w x x y y z z等字母 最後得到的文字即為密碼。輸入一串文字,長度固定為5。輸出對應的密碼。格式為 password is 密碼 input chinaoutp...

閒話雲計算

雲計算隨著google的壯大一起成長了起來,逐漸由一些概念產生出了一些實際的東西。雲其實並不是很模糊或者高深的概念,sun當年的口號就是 網路就是計算機。當時真的不是很理解,放到現在就容易裂解的多了。雲計算依託不斷增長的網路頻寬,將資源整合到雲端,實現集中的管理,更加有效率的運用計算機資源。1.儲存...