青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

windows核心編程--字符集

 字符unicode與windows

 
1 軟件的本地化要解決的真正問(wèn)題,實(shí)際上就是如何來(lái)處理不同的字符集。以前我們習(xí)慣與用單字節(jié)字符集來(lái)編程.
2 單字符集:將文本串作為一系列單字節(jié)字符來(lái)進(jìn)行編碼,并在結(jié)尾處放上一個(gè)零。(每個(gè)字符用一個(gè)字節(jié)來(lái)表示)
3 雙字節(jié)字符集(D B C S ):在雙字節(jié)字符集中,字符串中的每個(gè)字符可以包含一個(gè)字節(jié)或包含兩個(gè)字節(jié)。
4 unicode字符集:U n i c o d e 提供了一種簡(jiǎn)單而又一致的表示字符串的方法。U n i c o d e 字符串中的所有字符都是1 6 位的(兩個(gè)字節(jié))。
5 當(dāng)M i c r o s o f t 公司將C O M 從1 6 位Wi n d o w s 轉(zhuǎn)換成Wi n 3 2 時(shí),公司作出了一個(gè)決定,即需要字符串的所有C O M 接口方法都只能接受U n i c o d e 字符串。
6 c運(yùn)行期庫(kù)支持unicode,即使是windows98也支持.
7 Windows 2000 的N o t e p a d (記事本)應(yīng)用程序允許你既能打開(kāi)U n i c o d e 文件,也能打開(kāi)A N S I 文件,并且可以創(chuàng)建這些文件。
8 I s Te x t U n i c o d e 函數(shù)能夠幫助進(jìn)行區(qū)分ANSIC字符和unicode:
DWORD IsTextUnicode(CONST PVOID pvBuffer, int cb,PINT pResult);

第一個(gè)參數(shù)p v B u ff e r 用于標(biāo)識(shí)要測(cè)試的緩存的地址。該數(shù)據(jù)是個(gè)無(wú)效指針,因?yàn)槟悴恢滥銚碛械氖茿 N S I 字符數(shù)組還是U n i c o d e 
字符數(shù)組。

第二個(gè)參數(shù)c b 用于設(shè)定p v B u ff e r 指向的字節(jié)數(shù)。同樣,由于你不知道緩存中放的是什么,因此c b 是個(gè)字節(jié)數(shù),而不是字符數(shù)。請(qǐng)注意,不必設(shè)定緩存的整個(gè)長(zhǎng)度。當(dāng)然,I s Te x t U n i c o d e能夠測(cè)試的字節(jié)越多,得到的結(jié)果越準(zhǔn)確。

第三個(gè)參數(shù)p R e s u l t 是個(gè)整數(shù)的地址,必須在調(diào)用I s Te x t U n i c o d e 之前對(duì)它進(jìn)行初始化。對(duì)該整數(shù)進(jìn)行初始化后,就可以指明你要I s Te x t U n i c o d e 執(zhí)行哪些測(cè)試。也可以為該參數(shù)傳遞N U L L ,在這種情況下,I s Te x t U n i c o d e 將執(zhí)行它能夠進(jìn)行的所有測(cè)試(詳細(xì)說(shuō)明請(qǐng)參見(jiàn)Platform SDK 文檔)。

9 對(duì)D B C S 字符串進(jìn)行操作的幫助函數(shù)

函數(shù) 描述
PTSTR CharNext(PCTSTR pszCurrentChar); 返回字符串中的下一個(gè)字符的地址
PTSTR CharPrev (PCTSTR pszStart,PCTSTR p s z C u r r e n t C h a r); 返回字符串中的上一個(gè)字符的地址
BOOL IsDBCSLeadByteTRUE(BYTE bTestChar); 如果該字節(jié)是DBCS 字符的第一個(gè)字節(jié),則返回


10 “M i c r o s o f t 公司對(duì)U n i c o d e 支持的情況”:

• Windows 2000 既支持U n i c o d e ,也支持A N S I ,因此可以為任意一種開(kāi)發(fā)應(yīng)用程序。

• Windows 98 只支持A N S I ,只能為A N S I 開(kāi)發(fā)應(yīng)用程序。

• Windows CE 只支持U n i c o d e ,只能為U n i c o d e 開(kāi)發(fā)應(yīng)用程序。

11 Wi n d o w s 頭文件定義de Uincode 數(shù)據(jù)類(lèi)型

數(shù)據(jù)類(lèi)型 說(shuō)明
W C H A R U n i c o d e 字符
P W S T R 指向U n i c o d e 字符串的指針
P C W S T R 指向一個(gè)恒定的U n i c o d e 字符串的指針
使用實(shí)例如下:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif //!UNICODE
在Unicode與ANSI之間轉(zhuǎn)換字符串

Wi n d o w s 函數(shù)M u l t i B y t e To Wi d e C h a r 用于將多字節(jié)字符串轉(zhuǎn)換成寬字符串。下面顯示了M u l t i B y t e To Wi d e C h a r 函數(shù)。

int MultiByteToWideChar(
UINT CodePage,          //code page
DWORD dwFlags,          //character-type options
LPCSTR lpMultiByteStr,  //address of string to map
int cchMultiByte,       //number of bytes in string
LPWSTR lpWideCharStr,   //address of wide-character buffer
int cchWideChar         //size of buffer
);
u C o d e P a g e 參數(shù)用于標(biāo)識(shí)一個(gè)與多字節(jié)字符串相關(guān)的代碼頁(yè)號(hào)。d w F l a g s 參數(shù)用于設(shè)定另一個(gè)控件,它可以用重音符號(hào)之類(lèi)的區(qū)分標(biāo)記來(lái)影響字符。這些標(biāo)志通常并不使用,在d w F l a g s參數(shù)中傳遞0 。p M u l t i B y t e S t r 參數(shù)用于設(shè)定要轉(zhuǎn)換的字符串,c c h M u l t i B y t e 參數(shù)用于指明該字符串的長(zhǎng)度(按字節(jié)計(jì)算)。如果為c c h M u l t i B y t e 參數(shù)傳遞- 1 ,那么該函數(shù)用于確定源字符串的長(zhǎng)度。

轉(zhuǎn)換后產(chǎn)生的U n i c o d e 版本字符串將被寫(xiě)入內(nèi)存中的緩存,其地址由p Wi d e C h a r S t r 參數(shù)指定。必須在c c h Wi d e C h a r 參數(shù)中設(shè)定該緩存的最大值(以字符為計(jì)量單位)。如果調(diào)用M u l t i B y t e To Wi d e C h a r ,給c c h Wi d e C h a r 參數(shù)傳遞0 ,那么該參數(shù)將不執(zhí)行字符串的轉(zhuǎn)換,而是返回為使轉(zhuǎn)換取得成功所需要的緩存的值。一般來(lái)說(shuō),可以通過(guò)下列步驟將多字節(jié)字符串轉(zhuǎn)換成U n i c o d e 等價(jià)字符串:

1) 調(diào)用M u l t i B y t e To Wi d e C h a r 函數(shù),為p Wi d e C h a r S t r 參數(shù)傳遞N U L L ,為c c h Wi d e C h a r 參數(shù)傳遞0 。
2) 分配足夠的內(nèi)存塊,用于存放轉(zhuǎn)換后的U n i c o d e 字符串。該內(nèi)存塊的大小由前面對(duì)M u l t B y t e To Wi d e C h a r 的調(diào)用返回。
3) 再次調(diào)用M u l t i B y t e To Wi d e C h a r ,這次將緩存的地址作為p Wi d e C h a r S t r 參數(shù)來(lái)傳遞,并傳遞第一次調(diào)用M u l t i B y t e To Wi d e C h a r 時(shí)返回的緩存大小,作為c c h Wi d e c h a r 參數(shù)。
4. 使用轉(zhuǎn)換后的字符串。
5) 釋放U n i c o d e 字符串占用的內(nèi)存塊。
函數(shù)Wi d e C h a r To M u l t i B y t e 將寬字符串轉(zhuǎn)換成等價(jià)的多字節(jié)字符串,如下所示:

int WideCharToMultiByte(
UINT CodePage,         // code page
DWORD dwFlags,         // performance and mapping flags
LPCWSTR lpWideCharStr, // address of wide-character string
int cchWideChar,       // number of characters in string
LPSTR lpMultiByteStr,  // address of buffer for new string
int cchMultiByte,      // size of buffer
LPCSTR lpDefaultChar,  // address of default for unmappable
// characters
LPBOOL lpUsedDefaultChar   // address of flag set when default
// char. used
);
該函數(shù)與M u l t i B i t e To Wi d e C h a r 函數(shù)相似。同樣,u C o d e P a g e 參數(shù)用于標(biāo)識(shí)與新轉(zhuǎn)換的字符串相關(guān)的代碼頁(yè)。d w F l a g s 則設(shè)定用于轉(zhuǎn)換的其他控件。這些標(biāo)志能夠作用于帶有區(qū)分符號(hào)的字符和系統(tǒng)不能轉(zhuǎn)換的字符。通常不需要為字符串的轉(zhuǎn)換而擁有這種程度的控制手段,你將為d w F l a g s 參數(shù)傳遞0 。

p Wi d e C h a r S t r 參數(shù)用于設(shè)定要轉(zhuǎn)換的字符串的內(nèi)存地址,c c h Wi d e C h a r 參數(shù)用于指明該字符串的長(zhǎng)度(用字符數(shù)來(lái)計(jì)量)。如果你為c c h Wi d e C h a r 參數(shù)傳遞- 1 ,那么該函數(shù)用于確定源字符串的長(zhǎng)度。

轉(zhuǎn)換產(chǎn)生的多字節(jié)版本的字符串被寫(xiě)入由p M u l t i B y t e S t r 參數(shù)指明的緩存。必須在c c h M u l t i B y t e參數(shù)中設(shè)定該緩存的最大值(用字節(jié)來(lái)計(jì)量)。如果傳遞0 作為Wi d e C h a r To M u l t i B y t e 函數(shù)的c c h M u l t i B y t e 參數(shù),那么該函數(shù)將返回目標(biāo)緩存需要的大小值。通??梢允褂脤⒍嘧止?jié)字符串轉(zhuǎn)換成寬字節(jié)字符串時(shí)介紹的一系列類(lèi)似的事件,將寬字節(jié)字符串轉(zhuǎn)換成多字節(jié)字符串。

你會(huì)發(fā)現(xiàn),Wi d e C h a r To M u l t i B y t e 函數(shù)接受的參數(shù)比M u l t i B y t e To Wi d e C h a r 函數(shù)要多2 個(gè),即p D e f a u l t C h a r 和p f U s e d D e f a u l t C h a r 。只有當(dāng)Wi d e C h a r To M u l t i B y t e 函數(shù)遇到一個(gè)寬字節(jié)字符,而該字符在u C o d e P a g e 參數(shù)標(biāo)識(shí)的代碼頁(yè)中并沒(méi)有它的表示法時(shí),Wi d e C h a r To M u l t i B y t e 函數(shù)才使用這兩個(gè)參數(shù)。如果寬字節(jié)字符不能被轉(zhuǎn)換,該函數(shù)便使用p D e f a u l t C h a r 參數(shù)指向的字符。如果該參數(shù)是N U L L (這是大多數(shù)情況下的參數(shù)值),那么該函數(shù)使用系統(tǒng)的默認(rèn)字符。該默認(rèn)字符通常是個(gè)問(wèn)號(hào)。這對(duì)于文件名來(lái)說(shuō)是危險(xiǎn)的,因?yàn)閱?wèn)號(hào)是個(gè)通配符。

p f U s e d D e f a u l t C h a r 參數(shù)指向一個(gè)布爾變量,如果寬字符串中至少有一個(gè)字符不能轉(zhuǎn)換成等價(jià)多字節(jié)字符,那么函數(shù)就將該變量置為T(mén) R U E 。如果所有字符均被成功地轉(zhuǎn)換,那么該函數(shù)就將該變量置為FA L S E 。當(dāng)函數(shù)返回以便檢查寬字節(jié)字符串是否被成功地轉(zhuǎn)換后,可以測(cè)試該變量。同樣,通常為該測(cè)試傳遞N U L L 。

關(guān)于如何使用這些函數(shù)的詳細(xì)說(shuō)明,請(qǐng)參見(jiàn)Platform SDK 文檔。

如果使用這兩個(gè)函數(shù),就可以很容易創(chuàng)建這些函數(shù)的U n i c o d e 版本和A N S I 版本。例如,你可能有一個(gè)動(dòng)態(tài)鏈接庫(kù),它包含一個(gè)函數(shù),能夠轉(zhuǎn)換字符串中的所有字符。可以像下面這樣編寫(xiě)該函數(shù)的U n i c o d e 版本:

BOOL StringReverseW(PWSTR pWideCharStr)
{
//Get a pointer to the last character in the string.
PWSTR pEndOfStr=pWideCharStr+wcslen(pWideCharStr)-1;
wchar_t cCharT;
//Repeat until we reach the center character
//in the string.
while (pWideCharStr < pEndOfStr)
{
//Save a character in a temporary variable.
cCharT=*pWideCharStr;
//Put the last character in the first character.
*pWideCharStr =*pEndOfStr;
//Put the temporary character in the last character.
*pEndOfStr=cCharT;
//Move in one character from the left.
pWideCharStr++;
//Move in one character from the right.
pEndOfStr--;
}
//The string is reversed; return success.
return(TRUE);
}

你可以編寫(xiě)該函數(shù)的A N S I 版本以便該函數(shù)根本不執(zhí)行轉(zhuǎn)換字符串的實(shí)際操作。你也可以編寫(xiě)該函數(shù)的A N S I 版本,以便該函數(shù)它將A N S I 字符串轉(zhuǎn)換成U n i c o d e 字符串,將U n i c o d e 字符串傳遞給S t r i n g R e v e r s e W 函數(shù),然后將轉(zhuǎn)換后的字符串重新轉(zhuǎn)換成A N S I 字符串。該函數(shù)類(lèi)似下面的樣子:

 

BOOL StringReverseA(PSTR pMultiByteStr)
{
PWSTR pWideCharStr;
int nLenOfWideCharStr;
BOOL fOk = FALSE;
//Calculate the number of characters needed to hold
//the wide_character version of string.
nLenOfWideCharStr = MultiRyteToWideChar(CP_ACP, 0,
pMultiByteStr, -1, NULL, 0);
//Allocate memory from the process's default heap to
//accommodate the size of the wide-character string.
//Don't forget that MultiByteToWideChar returns the
//number of characters,not the number of bytes,so
//you must multiply by the size of wide character.
pWideCharStr = HeapAlloc(GetProcessHeap(), 0,
nLenOfWideCharStr * sizeof(WCHAR));
if (pWideCharStr == NULL)
return(fOk);
//Convert the multibyte string to a wide_character string.
MultiByteToWideChar(CP_ACP, 0, pMulti8yteStr, -1,
pWideCharStr, nLenOfWideCharStr);
//Call the wide-character version of this
//function to do the actual work
fOk = StnngReverseW(pWideCharStr);
if (fOk)
{
//Convert the wide-character string back
//to a multibyte string.
WideCharToMultiByte(CP_ACP, 0, pWideCharStr, -1,
pMultiByteStr, strlen(pMultiByteStr), NULL, NULL);
}
//Free the momory containing the wide-character string.
HeapFree(GetProcessHeap(), 0, pWideCharStr);
return(fOk),
}
最后,在用動(dòng)態(tài)鏈接庫(kù)分配的頭文件中,可以像下面這樣建立這兩個(gè)函數(shù)的原型:

 

BOOL StringReverseW (PWSTR pWideCharStr);
BOOL StringReverseA (PSTR pMultiByteStr);
#ifdef UNICODE
#define StnngReverse StringReverseW
#else
#define StringRevcrsc StringReverseA
#endif // UNICODE

posted on 2006-09-11 16:57 夢(mèng)在天涯 閱讀(1871) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): Windows API

評(píng)論

# re: windows核心編程--字符集 2006-09-12 08:50 笨笨

大家都在搞核心編程?。∵@本書(shū)值得好好研究  回復(fù)  更多評(píng)論   

# re: windows核心編程--字符集 2006-09-12 09:18 夢(mèng)在天涯

恩,是的,值的好好研究啊,很難啊,但是可以學(xué)到windows的工作原理,有助于更好地在windows上編程!  回復(fù)  更多評(píng)論   

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評(píng)論 - 746
  • 引用 - 0

常用鏈接

隨筆分類(lèi)

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811740
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲欧洲中文日韩久久av乱码| 99国产精品久久久久久久成人热| 午夜视频久久久久久| 国产欧美亚洲精品| 欧美韩国在线| 国产精品老女人精品视频| 久久精彩免费视频| 久久亚洲精品视频| 久久国产精品免费一区| 国产主播在线一区| 99视频热这里只有精品免费| 国产精品视频观看| 亚洲国产精品欧美一二99| 国产精品女同互慰在线看| 欧美激情精品久久久久久久变态| 欧美日韩一区二区在线观看视频 | 欧美好吊妞视频| 欧美专区18| 国产精品伦一区| 99精品国产高清一区二区| 亚洲电影免费观看高清完整版| 亚洲婷婷国产精品电影人久久| 亚洲成人在线视频播放| 亚洲欧美日本另类| 香蕉av777xxx色综合一区| 欧美日韩福利| 99精品视频免费全部在线| 亚洲麻豆视频| 欧美精品激情blacked18| 亚洲国产日韩一区| 亚洲无线观看| 国产欧美精品| 久久久久综合网| 亚洲精品免费在线| 午夜精品一区二区三区在线播放| 国产精品视频精品视频| 午夜精品久久久久久久99黑人| 午夜欧美电影在线观看| 久久频这里精品99香蕉| 亚洲国产精品嫩草影院| 欧美国产在线观看| 亚洲校园激情| 欧美二区乱c少妇| 99精品免费视频| 国内外成人在线| 欧美久久精品午夜青青大伊人| 99国产精品久久久久久久| 久久久精品国产免费观看同学 | 欧美一区二区私人影院日本 | 国产精品qvod| 美女91精品| 午夜在线精品| 99在线精品视频在线观看| 男女精品网站| 久久成人精品电影| 一区二区日韩| 99国产精品视频免费观看一公开| 国产精品wwwwww| 亚洲一二三级电影| 亚洲精品一区二区在线观看| 国产欧美亚洲一区| 欧美日韩亚洲综合一区| 欧美日本二区| 欧美日韩一区二区三区四区五区| 久久手机精品视频| 久久在线视频| 欧美久久综合| 国产精品不卡在线| 国产欧美日韩综合一区在线播放| 欧美日韩在线精品| 国产日韩视频| 亚洲国产激情| 亚洲影音一区| 久久国产精品久久久久久| 久久久久九九视频| 欧美大胆a视频| 99re6热只有精品免费观看| 一区二区黄色| 狼狼综合久久久久综合网| 欧美理论在线| 国产欧美一区二区精品婷婷 | 久久久欧美精品sm网站| 免费久久99精品国产| 亚洲毛片在线免费观看| 先锋影音久久久| 国产精品久久久久久模特| 欧美精品午夜视频| 国产亚洲毛片| 亚洲一级二级| 欧美电影免费观看高清| 亚洲免费视频网站| 欧美日韩国产色视频| 国产综合色产在线精品| 在线一区二区三区四区| 欧美成人精品1314www| 亚洲欧美一区二区激情| 欧美日韩在线直播| 亚洲高清精品中出| 久久久久久久高潮| 欧美精品国产精品日韩精品| 午夜精彩国产免费不卡不顿大片| 国产精品99久久久久久宅男| 久久久久久久网站| 国产亚洲综合精品| 性欧美暴力猛交另类hd| 一本色道婷婷久久欧美| 欧美日韩国产免费观看| 亚洲激情视频网| 亚洲高清免费在线| 欧美久久久久免费| 99视频国产精品免费观看| 亚洲人体大胆视频| 国产精品黄色在线观看| 亚洲天堂激情| 亚洲一区二区四区| 精品88久久久久88久久久| 欧美激情国产精品| 欧美日韩国产二区| 久久久噜噜噜久噜久久| 久久一区亚洲| 一本久久a久久精品亚洲| 久久国产黑丝| 国内精品久久久久伊人av| 欧美成人国产va精品日本一级| 国产欧美一区二区三区在线老狼| 久久精品人人| 亚洲国产福利在线| 国产精品草草| 亚洲第一区在线| 国产在线视频欧美| 日韩视频免费在线| 亚洲第一精品夜夜躁人人躁 | 亚洲国产精品电影| 亚洲视频一区二区在线观看| 国产亚洲综合精品| 一本色道久久| 亚洲视频axxx| 欧美精品www| 最新成人av在线| 激情亚洲一区二区三区四区| 亚洲一区国产精品| 性欧美在线看片a免费观看| 国产精品白丝jk黑袜喷水| 亚洲人午夜精品| 一本色道久久88综合亚洲精品ⅰ | 亚洲国产精品va在线看黑人动漫| 亚洲一区二区少妇| 一区二区三区www| 亚洲欧美日韩综合一区| 欧美涩涩网站| 欧美一区国产在线| 免费一区视频| 99视频超级精品| 国产精品男女猛烈高潮激情| 一本色道婷婷久久欧美| 欧美一区二区三区免费在线看 | 亚洲一区二区三区久久| 久久久久成人网| 日韩小视频在线观看专区| 欧美aa国产视频| 亚洲一区国产一区| 女人香蕉久久**毛片精品| 一本色道久久综合亚洲精品不卡 | 一本一道久久综合狠狠老精东影业| 欧美国产另类| 久久久久久一区二区| 亚洲国产精品www| 久久精品在线免费观看| 中文av一区特黄| 国产精品日韩在线观看| 欧美大片91| 久久久久欧美| 亚洲欧美日本伦理| 中文成人激情娱乐网| 亚洲第一精品影视| 媚黑女一区二区| 麻豆精品网站| 久久男女视频| 在线视频一区观看| 中日韩在线视频| 亚洲一区免费看| 亚洲欧美另类综合偷拍| 亚洲午夜在线观看| 亚洲在线中文字幕| 亚洲综合日韩| 香港久久久电影| 欧美一级电影久久| 欧美一区二区三区播放老司机 | 久久精品免费| 久久久精品日韩| 欧美高清hd18日本| 欧美日韩另类一区| 国产精品一二三四区| 国内精品一区二区| 亚洲激情另类| 亚洲欧美视频在线观看视频| 久久精品国产亚洲aⅴ| 快射av在线播放一区| 日韩视频在线一区二区三区| 中文一区二区在线观看|