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

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

windows核心編程--字符集

 字符unicode與windows

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

第一個參數p v B u ff e r 用于標識要測試的緩存的地址。該數據是個無效指針,因為你不知道你擁有的是A N S I 字符數組還是U n i c o d e 
字符數組。

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

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

9 對D B C S 字符串進行操作的幫助函數

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


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

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

• Windows 98 只支持A N S I ,只能為A N S I 開發應用程序。

• Windows CE 只支持U n i c o d e ,只能為U n i c o d e 開發應用程序。

11 Wi n d o w s 頭文件定義de Uincode 數據類型

數據類型 說明
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 指向一個恒定的U n i c o d e 字符串的指針
使用實例如下:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif //!UNICODE
在Unicode與ANSI之間轉換字符串

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

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 參數用于標識一個與多字節字符串相關的代碼頁號。d w F l a g s 參數用于設定另一個控件,它可以用重音符號之類的區分標記來影響字符。這些標志通常并不使用,在d w F l a g s參數中傳遞0 。p M u l t i B y t e S t r 參數用于設定要轉換的字符串,c c h M u l t i B y t e 參數用于指明該字符串的長度(按字節計算)。如果為c c h M u l t i B y t e 參數傳遞- 1 ,那么該函數用于確定源字符串的長度。

轉換后產生的U n i c o d e 版本字符串將被寫入內存中的緩存,其地址由p Wi d e C h a r S t r 參數指定。必須在c c h Wi d e C h a r 參數中設定該緩存的最大值(以字符為計量單位)。如果調用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 參數傳遞0 ,那么該參數將不執行字符串的轉換,而是返回為使轉換取得成功所需要的緩存的值。一般來說,可以通過下列步驟將多字節字符串轉換成U n i c o d e 等價字符串:

1) 調用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 參數傳遞N U L L ,為c c h Wi d e C h a r 參數傳遞0 。
2) 分配足夠的內存塊,用于存放轉換后的U n i c o d e 字符串。該內存塊的大小由前面對M u l t B y t e To Wi d e C h a r 的調用返回。
3) 再次調用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 參數來傳遞,并傳遞第一次調用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 參數。
4. 使用轉換后的字符串。
5) 釋放U n i c o d e 字符串占用的內存塊。
函數Wi d e C h a r To M u l t i B y t e 將寬字符串轉換成等價的多字節字符串,如下所示:

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
);
該函數與M u l t i B i t e To Wi d e C h a r 函數相似。同樣,u C o d e P a g e 參數用于標識與新轉換的字符串相關的代碼頁。d w F l a g s 則設定用于轉換的其他控件。這些標志能夠作用于帶有區分符號的字符和系統不能轉換的字符。通常不需要為字符串的轉換而擁有這種程度的控制手段,你將為d w F l a g s 參數傳遞0 。

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

轉換產生的多字節版本的字符串被寫入由p M u l t i B y t e S t r 參數指明的緩存。必須在c c h M u l t i B y t e參數中設定該緩存的最大值(用字節來計量)。如果傳遞0 作為Wi d e C h a r To M u l t i B y t e 函數的c c h M u l t i B y t e 參數,那么該函數將返回目標緩存需要的大小值。通常可以使用將多字節字符串轉換成寬字節字符串時介紹的一系列類似的事件,將寬字節字符串轉換成多字節字符串。

你會發現,Wi d e C h a r To M u l t i B y t e 函數接受的參數比M u l t i B y t e To Wi d e C h a r 函數要多2 個,即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 。只有當Wi d e C h a r To M u l t i B y t e 函數遇到一個寬字節字符,而該字符在u C o d e P a g e 參數標識的代碼頁中并沒有它的表示法時,Wi d e C h a r To M u l t i B y t e 函數才使用這兩個參數。如果寬字節字符不能被轉換,該函數便使用p D e f a u l t C h a r 參數指向的字符。如果該參數是N U L L (這是大多數情況下的參數值),那么該函數使用系統的默認字符。該默認字符通常是個問號。這對于文件名來說是危險的,因為問號是個通配符。

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

關于如何使用這些函數的詳細說明,請參見Platform SDK 文檔。

如果使用這兩個函數,就可以很容易創建這些函數的U n i c o d e 版本和A N S I 版本。例如,你可能有一個動態鏈接庫,它包含一個函數,能夠轉換字符串中的所有字符。可以像下面這樣編寫該函數的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);
}

你可以編寫該函數的A N S I 版本以便該函數根本不執行轉換字符串的實際操作。你也可以編寫該函數的A N S I 版本,以便該函數它將A N S I 字符串轉換成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 函數,然后將轉換后的字符串重新轉換成A N S 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),
}
最后,在用動態鏈接庫分配的頭文件中,可以像下面這樣建立這兩個函數的原型:

 

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 夢在天涯 閱讀(1871) 評論(2)  編輯 收藏 引用 所屬分類: Windows API

評論

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

大家都在搞核心編程啊!這本書值得好好研究  回復  更多評論   

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

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

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811742
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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亚洲一区二区| 尤物九九久久国产精品的分类| 女同性一区二区三区人了人一| 欧美国产在线电影| 久久精品人人做人人爽电影蜜月 | 小辣椒精品导航| 亚洲精品1234| 久久九九国产精品| 欧美亚洲免费在线| 欧美日韩三级电影在线| 免费成人av在线看| 精品999日本| 影院欧美亚洲| 亚洲一区在线观看免费观看电影高清 | 一本久道久久综合狠狠爱| 国产一区二区按摩在线观看| 亚洲人成啪啪网站| 亚洲韩国精品一区| 亚洲激情网址| 欧美v日韩v国产v| 久久午夜av| 91久久夜色精品国产九色| 中文av字幕一区| 亚洲在线观看免费视频| 欧美日本国产在线| 亚洲一区免费| 欧美在线观看一区| 怡红院精品视频| 欧美成人午夜| 亚洲一区欧美一区| 免费看av成人| 中文国产亚洲喷潮| 国产亚洲成av人在线观看导航| 亚洲欧美日韩国产精品| 久久久夜精品| 日韩视频免费大全中文字幕| 欧美日韩亚洲91| 欧美一区二区三区久久精品| 欧美国产91| 欧美在线1区| 99pao成人国产永久免费视频| 欧美日韩一区二区三区四区在线观看| 一区二区三区国产盗摄| 老司机一区二区三区| av成人毛片| 亚洲大片在线观看| 国产精品久久久久久久久婷婷| 欧美永久精品| 亚洲资源在线观看| 亚洲国产欧美在线| 欧美成人国产va精品日本一级| 亚洲综合视频网| 一区二区三区高清不卡| 91久久视频| 亚洲精品久久视频| 亚洲风情亚aⅴ在线发布| 国产精品最新自拍| 国产日韩一区二区三区在线| 欧美日本亚洲| 欧美日韩一区二区三区在线视频| 久久久久久久欧美精品| 欧美一区二区高清| 欧美一区二区啪啪| 久久免费精品视频| 久久一本综合频道| 欧美猛交免费看| 欧美日韩中文| 国产亚洲人成网站在线观看| 国产精品亚洲综合久久| 国产在线一区二区三区四区| 国产一区二区精品久久| 影音先锋中文字幕一区| 亚洲精品专区| 欧美亚洲网站| 亚洲东热激情| 小嫩嫩精品导航| 欧美日韩黄色一区二区| 国产午夜精品美女视频明星a级| 黄色成人片子| 亚洲视频免费| 亚洲大片在线观看| 亚洲免费综合| 欧美视频日韩| 91久久午夜| 欧美成人午夜激情在线| 亚洲午夜激情| 欧美巨乳波霸| 亚洲精品女人| 欧美韩国在线| 老色批av在线精品| 国内久久精品视频| 欧美一区二区精品久久911| 91久久精品美女高潮| 久久国产夜色精品鲁鲁99| 国产精品美女xx| 一区二区三区精品国产| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲国产日韩一级| 欧美精品www| 99v久久综合狠狠综合久久| 欧美激情视频给我| 久久天天躁狠狠躁夜夜爽蜜月| 国产一区二区三区高清| 久久av老司机精品网站导航| 亚洲视频在线观看免费| 国产精品久久久久久久第一福利| 亚洲在线成人| 亚洲欧美日韩精品久久久| 国产视频一区在线观看一区免费| 久久国产高清| 蜜桃精品一区二区三区| 亚洲一区二区在线| 久久大逼视频| 亚洲一区二区三区精品在线观看| 亚洲欧美卡通另类91av | 欧美不卡视频| 国产精品福利在线观看| 久久综合九色综合欧美就去吻 | 一区二区冒白浆视频| 国产片一区二区| 91久久亚洲| 黄色一区二区三区| 亚洲综合视频1区| 日韩视频专区| 久久久久一本一区二区青青蜜月| 夜夜狂射影院欧美极品| 老司机成人网| 蜜臀av国产精品久久久久| 欧美无乱码久久久免费午夜一区| 久久亚洲风情| 国产欧美一区二区色老头| 999在线观看精品免费不卡网站| 亚洲电影av| 久久久久一区二区三区| 久久久久国产精品一区| 国产精品久久久亚洲一区| 亚洲精品国产精品国自产在线| 国产一区二区三区在线观看免费| 在线视频欧美日韩精品| 一区二区三区视频在线看| 欧美久久久久久久久| 91久久夜色精品国产九色| 亚洲三级国产| 欧美日韩mp4| 亚洲欧美日韩在线高清直播| 亚洲欧美自拍偷拍| 国产一区二区三区观看| 久久久99国产精品免费| 欧美大片免费| 国产精品99久久久久久有的能看| 欧美日韩在线一区| 欧美一区二区黄| 亚洲日本一区二区| 午夜精品剧场| 亚洲精品国产系列| 欧美午夜视频网站| 快播亚洲色图| 亚洲男人第一av网站| 亚洲日本成人女熟在线观看| 亚洲欧美视频在线观看视频| 亚洲成人原创| 国产亚洲综合精品| 欧美日韩国产天堂| 久久午夜影视| 欧美在线你懂的| 亚洲影视中文字幕| 一区二区高清视频| 亚洲精品国产精品国自产观看浪潮 | 国产亚洲一区二区精品| 欧美日韩国产精品自在自线| 欧美一区二区三区日韩视频| 亚洲精品乱码久久久久久按摩观| 久久婷婷国产综合国色天香 | 中文精品视频| 99精品国产热久久91蜜凸| 欧美成人午夜激情在线| 久久综合色婷婷| 你懂的一区二区| 久久久人人人| 亚洲高清自拍| 亚洲美女中文字幕| 亚洲视频图片小说| 午夜精品一区二区三区在线视 | 免费高清在线视频一区·| 久久久夜精品| 欧美激情一区二区三区蜜桃视频| 欧美伦理a级免费电影| 国产精品视频yy9299一区| 国产伊人精品| 99视频精品免费观看|