C 字串系列1 字元編碼基礎

2021-05-22 03:02:40 字數 2821 閱讀 9375

一、從ascii碼到unicode

計算機發明後,為了在計算機中表示字元,人們制定了一種編碼,叫ascii碼。ascii碼由乙個位元組中的7位(bit)表示,範圍是0x00 - 0x7f 共128個字元。他們以為這128個數字就足夠表示abcd...abcd...1234 這些字元了。

咳......說英語的人就是「笨」!後來他們突然發現,如果需要按照**方式列印這些字元的時候,缺少了「製表符」。於是又擴充套件了ascii的定 義,使用乙個位元組的全部8位(bit)來表示字元了,這就叫擴充套件ascii碼。範圍是0x00 - 0xff 共256個字元。

咳......說中文的人就是聰明!中國人利用連續2個擴充套件ascii碼的擴充套件區域(0xa0以後)來表示乙個漢字,該方法的標準叫gb-2312。 後來,日文、韓文、阿拉伯文、台灣繁體(big-5)......都使用類似的方法擴充套件了本地字符集的定義,現在統一稱為 mbcs 字符集(多位元組字符集)。這個方法是有缺陷的,因為各個國家地區定義的字符集有交集,因此使用gb-2312的軟體,就不能在big-5的環境下執行(顯 示亂碼),反之亦然。

咳......說英語的人終於變「聰明」一些了。為了把全世界人民所有的所有的文字元號都統一進行編碼,於是制定了unicode標準字符集。 unicode 使用2個位元組表示乙個字元(unsigned shor int、wchar、_wchar_t、olechar)。這下終於好啦,全世界任何乙個地區的軟體,可以不用修改地就能在另乙個地區執行了。雖然我用 ie 瀏覽日本**,顯示出我不認識的日文文字,但至少不會是亂碼了。unicode 的範圍是 0x0000 - 0xffff 共6萬多個字元,其中光漢字就占用了4萬多個。嘿嘿,中國人賺大發了:0)

在unicode裡,所有的字元被一視同仁,漢字不再使用「兩個擴充套件ascii」,而是使用「1個unicode」,也就是說,所有的文字都按乙個字元來 處理,它們都有乙個唯一的unicode碼.

二、使用unicode編碼的好處

使用unicode編碼可以使您的工程同時支援多種語言,使您的工程國際化。

另外,windows nt是使用unicode進行開發的,整個系統都是基於unicode的。如果呼叫乙個api函式並給它傳遞乙個ansi(ascii字符集以及由此派生 並相容的字符集,如:gb2312,通常稱為ansi字符集)字串,那麼系統首先要將字串轉換成unicode,然後將unicode字串傳遞給操 作系統。如果希望函式返回ansi字串,系統就會首先將unicode字串轉換成ansi字串,然後將結果返回給您的應用程式。進行這些字串的轉 換需要占用系統的時間和記憶體。如果用unicode來開發應用程式,就能夠使您的應用程式更加有效地執行。

下面例舉幾個字元的編碼以簡單演示ansi和unicode的區別: 字元a

n和ansi碼

41h4eh

cdbah

unicode碼

0041h

004eh

548ch

三、在程式中使用各種字符集的方法

const char * p = "hello"; //使用 ascii 字符集

//使用 mbcs 字符集,由於 mbcs 完全相容 ascii,多數情況下我們並不嚴格區分

const char * p = "你好";      

lpcstr p = "hello,你好"; // 意義同上

const wchar * p = l"hello,你好"; // 使用 unicode 字符集

lpcolestr p = l"hello,你好"; // 意義同上

// 如果預定義了_unicode,則表示使用unicode字符集;如果定義了_mbcs,則表示使用 mbcs

const tchar * p = _t("hello,你好");

lpctstr p = _t("hello,你好"); // 意義同上

在上面的例子中,t是非常有意思的乙個符號(tchar、lpctstr、lptstr、_t()、_text()...),它表示使用一種中間型別,既 不明確表示使用 mbcs,也不明確表示使用 unicode。那到底使用哪種字符集那?嘿嘿......編譯的時候決定吧。設定條件編譯的方式是:vc6 中,"project/settings.../c/c++卡片 preprocessor definitions" 中新增或修改 _mbcs、_unicode;vc.net中,"專案/屬性/配置屬性/常規/字符集"然後用組合窗進行選擇。使用 t 型別,是非常好的習慣,嚴重推薦!

四、vc++6.0中編寫unicode編碼的應用程式

使用unicode的工程設定包括兩種:unicode和_unicode,前者沒有下劃線,專門用於windows標頭檔案;後者有乙個字首下劃 線,專門用於c執行時標頭檔案。換句話說,也就是在ansi c++語言裡面根據_unicode(有下劃線)定義與否,各巨集分別展開為unicode或ansi字元,在windows裡面根據unicode(無下 劃線)定義與否,各巨集分別展開為unicode或ansi字元。實際使用中我們一般不加嚴格區分,同時定義_unicode和unicode,以實現 unicode版本程式設計。

在沒有定義unicode和_unicode時,所有函式和型別都預設使用ansi的版本;在定義了unicode和_unicode之後,所有的mfc 類和windows api都變成了寬位元組版本了。

附錄:unicode編碼表

python系列 1 字串操作

1.去除空格 str.strip 刪除字串兩邊的指定字元,括號的寫入指定字元,預設為空格 a hello b a.strip print b hello str.lstrip 刪除字串左邊的指定字元,括號的寫入指定字元,預設為空格 str.rstrip 刪除字串右邊指定字元,預設為空格 2.複製字串...

字串1 字串的旋轉

題目描述 給定乙個字串,要求將字串前面的若干個字元移到字串的尾部。例如 將字串 abcdef 的前三個字元 a b c 移到字串的尾部,那麼原字串將變成 defabc 首先想到的是將需要移動的字元乙個乙個移到字串的尾部。實現如下 public class transfet s n 1 t publi...

Java基礎方法1 字串

字串合集 public static void main string args system.out.println sum system.out.println str 完整輸出字串 system.out.println str.charat 6 指定下標字元輸出 system.out.prin...