字符集操作

2021-06-16 21:15:40 字數 2346 閱讀 3661

首先,介紹乙個windows的字符集,windows所支援的字符集包括兩種,多位元組和寬字元(unicode),而在win2k及其以上核心中,都是使用寬字元來實現的,但也保留了多位元組支援的api介面,這個實現的原理,其實是收到多位元組後,把其轉換為寬字元,再傳下核心物件處理的。

還有一點需要說明,mircosoft將com從16位轉換成32位時,規定了將需要字串的方法只接受unicode字串。

下面先介紹一下兩個巨集

執行時庫標頭檔案定義unicode環境的巨集 unicode

windows標頭檔案定義unicode環境的巨集 _unicode

microsoft公司提供的c執行時庫與ansi標準c執行時庫是一致的,而ansi規定執行時庫必須支援unicode和ansi(多位元組)字串和字元,所以windows執行時庫也是支援多位元組和寬字元編碼操作的兩套介面的。

最典型的是 多位元組介面:strlen,strcat,strcmp等,對應的寬字元介面:wcslen,wcscat,wcscmp等。

有了上面的基礎,我們開始說到主題。

由於arx環境是需要支援多個版本,而字元操作在arx中是非常常見的,所以很近切的需要能解決既能在多位元組環境編譯又能在寬字元環境編譯的**。不用急,windows開發過程中也存在同樣的問題的,所以,microsoft是提供了解決方案的,關鍵就在tchar.h這個標頭檔案中。

在tchar.h檔案中,會根據_unicode巨集是否定義來實現字元編碼及其操作介面的自適應,如,在該檔案中,對於char的定義是這樣的,當定義的_unicode巨集是 typedef wchar_t tchar,當沒有定義時 typedef char tchar,所以,當我們在定義字串或字元時,只需要使用tchar來代替char,就能實現多位元組與寬字元環境自適應的字元定義了。

定義後,我們關心的就是正確的給變數賦值了,在執行時庫中,提供乙個方法,當在某個字串常量前加上大寫l,則通知編譯器,該字串作為unicode字串來編譯,所以在tchar.h中也利用了這一點,來定義了隨環境變化的通知編譯器字元編碼的機制。當定義了_unicode時,#define _text(x) l##x,當沒有定義時 #define _text(x) x,這樣只需要對每個常量字串加上_text()操作就可以自適應編譯環境了。而在tchar.h中_text又被定義成了更短,大名鼎鼎的_t了,所以,我們只需要對每個常量字串加上_t()操作就可以自適應編譯環境了。

另外一點,tchar.h中,也針對_unicode巨集是否定義,實現了一套自適應編碼環境的字元操作介面,所以建義在進行arx程式設計時,如果需要多版本的支援,一定要使用tchar.h中定義的字元操用介面。

而且還需要說明的一點,mfc中的cstring是隨環境自適應的字符集,所以建義大家在程式設計過程中,盡量使用cstring,而不是std::string。

最後把一常用需要注意的和代替的方法貼出來:

1.字串型別盡量用cstring

2.字元型別使用 tchar

3.字串陣列用 tchar

4.字串指標用 tchar*

5.常量字串指標用 const tchar*

6.字串常量和字元常量加巨集 _t

特別的: 

1>cstring::format(_t("..."),...)//要加_t

2>lptstr 等等被多次巢狀定義過的巨集盡量少用,用基礎型別 const tchar*(或tchar*)替代;

3>為tchar*型別指標分配 n-1 個字元的空間: tchar* pbuffer = new tchar[ n*sizeof(tchar) ];

常用字串函式,須使用支援unicode/ansi的巨集函式替換前者:

ansi字串函式 unicode/ansi巨集函式 功能說明 

strcpy _tcscpy      字串拷貝 

strcat _tcscat      字串連線

strlen _tcslen       求字串長度 

strcmp _tcscmp     字串比較 

atof _tcstod (注) 字串轉換為double 

atoi _ttoi 字串轉換為int 

注:上表中 _tcstod 和 atof用法不同,不能直接替換。

tchar與cstring 互相轉換

cstring   str   =   _t("你好");   

char   s[50];   

s   =   (lptstr)(lpctstr)str;   

str   =   (lpctstr)(lpstr)s;

附上objectarx每個版本對應的字符集:

objectarx2007及其以上都是unicode(寬字元)編碼。

objectarx2007以下都是ansi(多位元組)編碼。

#objectarx

MySQL字符集操作

檢視所有可用字符集 show character set mysql字符集包括字符集 charset 和校對規則 collation 字符集用來定義mysql儲存字串的方式,校對規則是定義了比較字串的方式。乙個字符集至少對應乙個校對規則。字符集設定 有四個級別的預設設定 伺服器級,資料庫級,表級,字...

NIO字符集操作

示例程式 在開啟相應的檔案 將輸入資料讀入名為 inputdata 的 bytebuffer 之後,我們的程式必須建立 iso 8859 1 latin1 字符集的乙個例項 charset latin1 charset.forname iso 8859 1 然後,建立乙個解碼器 用於讀取 和乙個編碼...

mysql字符集操作

mysql的字符集支援 character set support 主要是兩個方面 1 字符集 character set 2 排序方式 collation mysql對於字符集的支援細化到以下幾個層次 伺服器,資料庫,資料表,資料列,連線等 mysql字符集引數選項各代表含義 character ...