說說字符集

2021-08-21 22:44:50 字數 1959 閱讀 1035

說說字符集<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

03-8-8 18:02 by leezy_2000

由於作者是美國人的緣故,我發現windows下的幾本名著(如《windows程式設計》,jeffrey richter的《windows 核心程式設計》)對字符集的講解都不甚透徹。現在這裡對一些易讓人迷惑的問題進行澄清,並指明一些程式設計時容易出錯的問題(我自己就犯過)。

先解釋幾個概念:

字符集:根據編碼特性而分,字符集可分為三類。 l

窄字符集(sbcs) 每個**由乙個位元組進行表示,比如ansi。 l

多位元組字符集(mbcs) 字符集中的**或者是單位元組,或者是多位元組,比如dbcs,gb2312等。 l

寬位元組字符集字符集中每個字元由兩個位元組表示。比如unicode

**頁:在unicode和dbcs中由於包含的**十分多,為了使用方便就需要對這些**進行組織。組織的方法就是把不同國家的**分別放入不同的**頁。

字符集與**頁的關係:由上可知,對於unicode和dbcs,**頁是從屬於字符集的。但對於sbcs類的字符集(比如ansi)和dbcs之外的mbcs字符集(比如gb2312等)他們則只對應於乙個**頁。

下面看一段潛在有問題的程式:

void converandoutputstring(hdc hdc,lpwstr wstr, int length,int x,int y)

這段程式很簡單,只是把乙個寬字串轉為dbcs串而後按指定的座標進行輸出。jeffrey richter在他的《windows核心程式設計》中的第26頁也用幾乎的相同的方法進行字串轉換。但這段程式其實是有問題的。問題出在轉換字串時不應該硬編碼指定**頁,而應該根據當前字型進行動態獲取。否則在某些情況下將無法把wstr中的unicode字元轉換到正確的**。如果你用上述**進行中文輸出,你將很有幸看到很多問號被自動新增到你的字串中。

解決的辦法也很簡單,但首先你要熟悉如下兩個個api函式:

這個函式可以把字符集、**頁和fontsignature互相轉換。轉換後的資訊
放在中。dwflags指明需要進行那種轉換,是把字符集轉換到**頁還是其他。
特別需要注意的是,psrc引數,這個引數在你進行字符集到**頁轉換的時候,需
要的是乙個具有指標型別的值而非指向某個值的指標。因此對上述字串輸出函式你
只要加上如下兩行,就可以保證字串在轉換期間不會遇到找不到字元**的情況。

void converandoutputstring(hdc hdc,lpwstr wstr, int length,int x,int y)

;translatecharsetinfo((dword*)charset,&csinfo,tci_srccharset);

nret=widechartomultibyte(csinfo. .ciacp,0,wstr , length,

lpbuffer, sizebuffer ,null,null);

textout(hdc,x,y, lpbuffer,nret);

deletelpbuffer;

}

最後總結一下,這篇文章的主題就是在做字符集間的轉換時,一定要動態確定**頁。
所涉及函式和結構的進一步細節請參考msdn。

mysql api 字符集 MySQL字符集

mysql字符集包括字符集 character 和 collation 兩個概念。字符集是用來定義mysql儲存字串的規則,校對規則則是定義了比較字串的方式。字串和校對規則是一對多的 關係。使用命令 show collation like gbk 可檢視相關的校對規則 使用 show charact...

Unicode字符集和多字符集

由於各國語言的加入,ascii已經不能滿足資訊交流的需要,因此,為了能夠表示其它國家的文字,各國在ascii的基礎上制定了自己的字符集,它們正式的名稱應該是mbcs multi byte chactacter system,即多位元組字元系統 型別說明 unicode ansi 通用型別 字元wch...

mysql 集群字符集 Mysql 字符集

字符集與字元比較 字符集字符集是某種字元的集合,比如最常見的ascii碼,由127個字元組成,只需要乙個位元組就能表示 我們常說的字符集還是gbk iso utf8 mysql 我們使用得最多的字符集就是gbk 和 utf8了 他們都是變長字符集,如果字元在ascii範圍內就使用乙個位元組表示,其他...