亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? c++字符串完全指南 - win32字符編碼(一) .txt

?? 我在畢業(yè)設(shè)計(jì)過程中涉及到socket編程
?? TXT
字號(hào):
C++字符串完全指南 - Win32字符編碼(一) 

作者: 翻譯:連波
Thursday, November 14 2002 6:11 PM  
 

前言

字符串的表現(xiàn)形式各異,象TCHAR,std::string,BSTR等等,有時(shí)還會(huì)見到怪怪的用_tcs起頭的宏。這個(gè)指南的目的就是說明各種字符串類型及其用途,并說明如何在必要時(shí)進(jìn)行類型的相互轉(zhuǎn)換。

在指南的第一部分,介紹三種字符編碼格式。理解編碼的工作原理是致為重要的。即使你已經(jīng)知道字符串是一個(gè)字符的數(shù)組這樣的概念,也請閱讀本文,它會(huì)讓你明白各種字符串類之間的關(guān)系。

指南的第二部分,將闡述各個(gè)字符串類,什么時(shí)候使用哪種字符串類,及其相互轉(zhuǎn)換。

字符串基礎(chǔ) - ASCII, DBCS, Unicode
所有的字符串類都起源于C語言的字符串,而C語言字符串則是字符的數(shù)組。首先了解一下字符類型。有三種編碼方式和三種字符類型。

第一種編碼方式是單字節(jié)字符集,稱之為SBCS,它的所有字符都只有一個(gè)字節(jié)的長度。ASCII碼就是SBCS。SBCS字符串由一個(gè)零字節(jié)結(jié)尾。

第二種編碼方式是多字節(jié)字符集,稱之為MBCS,它包含的字符中有單字節(jié)長的字符,也有多字節(jié)長的字符。Windows用到的MBCS只有二種字符類型,單字節(jié)字符和雙字節(jié)字符。因此Windows中用得最多的字符是雙字節(jié)字符集,即DBCS,通常用它來代替MBCS。

在DBCS編碼中,用一些保留值來指明該字符屬于雙字節(jié)字符。例如,Shift-JIS(通用日語)編碼中,值0x81-0x9F 和 0xE0-0xFC 的意思是:“這是一個(gè)雙字節(jié)字符,下一個(gè)字節(jié)是這個(gè)字符的一部分”。這樣的值通常稱為前導(dǎo)字節(jié)(lead byte),總是大于0x7F。前導(dǎo)字節(jié)后面是跟隨字節(jié)(trail byte)。DBCS的跟隨字節(jié)可以是任何非零值。與SBCS一樣,DBCS字符串也由一個(gè)零字節(jié)結(jié)尾。

第三種編碼方式是Unicode。Unicode編碼標(biāo)準(zhǔn)中的所有字符都是雙字節(jié)長。有時(shí)也將Unicode稱為寬字符集(wide characters),因?yàn)樗淖址葐巫止?jié)字符更寬(使用更多內(nèi)存)。注意,Unicode不是MBCS - 區(qū)別在于MBCS編碼中的字符長度是不同的。Unicode字符串用二個(gè)零字節(jié)字符結(jié)尾(一個(gè)寬字符的零值編碼)。

單字節(jié)字符集是拉丁字母,重音文字,用ASCII標(biāo)準(zhǔn)定義,用于DOS操作系統(tǒng)。雙字節(jié)字符集用于東亞和中東語言。Unicode用于COM和Windows NT內(nèi)部。

讀者都很熟悉單字節(jié)字符集,它的數(shù)據(jù)類型是char。雙字節(jié)字符集也使用char數(shù)據(jù)類型(雙字節(jié)字符集中的許多古怪處之一)。Unicode字符集用wchar_t數(shù)據(jù)類型。Unicode字符串用L前綴起頭,如:

  wchar_t  wch = L'1';      // 2 個(gè)字節(jié), 0x0031

  wchar_t* wsz = L"Hello";  // 12 個(gè)字節(jié), 6 個(gè)寬字符
 


字符串的存儲(chǔ)
單字節(jié)字符串順序存放各個(gè)字符,并用零字節(jié)表示字符串結(jié)尾。例如,字符串"Bob"的存儲(chǔ)格式為:



Unicode編碼中,L"Bob"的存儲(chǔ)格式為:



用0x0000 (Unicode的零編碼)結(jié)束字符串。

DBCS 看上去有點(diǎn)象SBCS。以后我們會(huì)看到在串處理和指針使用上是有微妙差別的。字符串"日本語" (nihongo) 的存儲(chǔ)格式如下(用LB和TB分別表示前導(dǎo)字節(jié)和跟隨字節(jié)):



注意,"ni"的值不是WORD值0xFA93。值93和FA順序組合編碼為字符"ni"。(在高位優(yōu)先CPU中,存放順序正如上所述)。

字符串處理函數(shù)
C語言字符串處理函數(shù),如strcpy(), sprintf(), atol()等只能用于單字節(jié)字符串。在標(biāo)準(zhǔn)庫中有只用于Unicode字符串的函數(shù),如wcscpy(), swprintf(), _wtol()。

微軟在C運(yùn)行庫(CRT)中加入了對DBCS字符串的支持。對應(yīng)于strxxx()函數(shù),DBCS使用_mbsxxx()函數(shù)。在處理DBCS字符串(如日語,中文,或其它DBCS)時(shí),就要用_mbsxxx()函數(shù)。這些函數(shù)也能用于處理SBCS字符串(因?yàn)镈BCS字符串可能就只含有單字節(jié)字符)。

現(xiàn)在用一個(gè)示例來說明字符串處理函數(shù)的不同。如有Unicode字符串L"Bob":



x86 CPU的排列順序是低位優(yōu)先(little-endian)的,值0x0042的存儲(chǔ)順序?yàn)?2 00。這時(shí)如用strlen()函數(shù)求字符串的長度就發(fā)生問題。函數(shù)找到第一個(gè)字節(jié)42,然后是00,意味著字符串結(jié)尾,于是返回1。反之,用wcslen()函數(shù)求"Bob"的長度更糟糕。wcslen()首先找到0x6F42,然后是0x0062,以后就在內(nèi)存緩沖內(nèi)不斷地尋找00 00直至發(fā)生一般性保護(hù)錯(cuò)(GPF)。

strxxx()及其對應(yīng)的_mbsxxx()究竟是如何運(yùn)作的?二者之間的不同是非常重要的,直接影響到正確遍歷DBCS字符串的方法。下面先介紹字符串遍歷,然后再回來討論strxxx()和 _mbsxxx()。

字符串遍歷
我們中的大多數(shù)人都是從SBCS成長過來的,都習(xí)慣于用指針的 ++ 和 -- 操作符來遍歷字符串,有時(shí)也使用數(shù)組來處理字符串中的字符。這二種方法對于SBCS 和 Unicode 字符串的操作都是正確無誤的,因?yàn)槎叩淖址际堑乳L的,編譯器能夠的正確返回我們尋求的字符位置。

但對于DBCS字符串就不能這樣了。用指針訪問DBCS字符串有二個(gè)原則,打破這二個(gè)原則就會(huì)造成錯(cuò)誤。

1. 不可使用 ++ 算子,除非每次都檢查是否為前導(dǎo)字節(jié)。

2. 絕不可使用 -- 算子來向后遍歷。

先說明原則2,因?yàn)楹苋菀渍业揭粋€(gè)非人為的示例。假設(shè),有一個(gè)配制文件,程序啟動(dòng)時(shí)要從安裝路徑讀取該文件,如:C:\Program Files\MyCoolApp\config.bin。文件本身是正常的。

假設(shè)用以下代碼來配制文件名:

bool GetConfigFileName ( char* pszName, size_t nBuffSize )
{
char szConfigFilename[MAX_PATH];
    // 這里從注冊表讀取文件的安裝路徑,假設(shè)一切正常。
    // 如果路徑末尾沒有反斜線,就加上反斜線。
    // 首先,用指針指向結(jié)尾零:
char* pLastChar = strchr ( szConfigFilename, '\0' );
    // 然后向后退一個(gè)字符:
    pLastChar--;  
    if ( *pLastChar != '\\' )
        strcat ( szConfigFilename, "\\" );
    // 加上文件名:
    strcat ( szConfigFilename, "config.bin" );
    // 如果字符串長度足夠,返回文件名:
    if ( strlen ( szConfigFilename ) >= nBuffSize )
        return false;
    else
        {
        strcpy ( pszName, szConfigFilename );
        return true;
        }
}
這段代碼的保護(hù)性是很強(qiáng)的,但用到DBCS字符串還是會(huì)出錯(cuò)。假如文件的安裝路徑用日語表達(dá):C:\ヨウユソ,該字符串的內(nèi)存表達(dá)為:



這時(shí)用上面的GetConfigFileName()函數(shù)來檢查文件路徑末尾是否含有反斜線就會(huì)出錯(cuò),得到錯(cuò)誤的文件名。
 

錯(cuò)在哪里?注意上面的二個(gè)十六進(jìn)制值0x5C(藍(lán)色)。前面的0x5C是字符"\",后面則是字符值83 5C,代表字符"ソ"。可是函數(shù)把它誤認(rèn)為反斜線了。

正確的方法是用DBCS函數(shù)將指針指向恰當(dāng)?shù)淖址恢茫缦滤荆?
bool FixedGetConfigFileName ( char* pszName, size_t nBuffSize )
{
char szConfigFilename[MAX_PATH];
    // 這里從注冊表讀取文件的安裝路徑,假設(shè)一切正常。
    // 如果路徑末尾沒有反斜線,就加上反斜線。
    // 首先,用指針指向結(jié)尾零:
char* pLastChar = _mbschr ( szConfigFilename, '\0' );
    // 然后向后退一個(gè)雙字節(jié)字符:
    pLastChar = CharPrev ( szConfigFilename, pLastChar );
    if ( *pLastChar != '\\' )
        _mbscat ( szConfigFilename, "\\" );
    // 加上文件名:
    _mbscat ( szConfigFilename, "config.bin" );
    // 如果字符串長度足夠,返回文件名:
    if ( _mbslen ( szInstallDir ) >= nBuffSize )
        return false;
    else
        {
        _mbscpy ( pszName, szConfigFilename );
        return true;
        }
} 
這個(gè)改進(jìn)的函數(shù)用CharPrev() API 函數(shù)將指針pLastChar向后移動(dòng)一個(gè)字符。如果字符串末尾的字符是雙字節(jié)字符,就向后移動(dòng)2個(gè)字節(jié)。這時(shí)返回的結(jié)果是正確的,因?yàn)椴粫?huì)將字符誤判為反斜線。
現(xiàn)在可以想像到第一原則了。例如,要遍歷字符串尋找字符":",如果不使用CharNext()函數(shù)而使用++算子,當(dāng)跟隨字節(jié)值恰好也是":"時(shí)就會(huì)出錯(cuò)。

與原則2相關(guān)的是數(shù)組下標(biāo)的使用:

 2a. 絕不可在字符串?dāng)?shù)組中使用遞減下標(biāo)。

出錯(cuò)原因與原則2相同。例如,設(shè)置指針pLastChar為:

char* pLastChar = &szConfigFilename [strlen(szConfigFilename) - 1];
結(jié)果與原則2的出錯(cuò)一樣。下標(biāo)減1就是指針向后移動(dòng)一個(gè)字節(jié),不符原則2。

再談strxxx() 與_mbsxxx()
現(xiàn)在可以清楚為什么要用 _mbsxxx() 函數(shù)了。strxxx() 函數(shù)不認(rèn)識(shí)DBCS字符而 _mbsxxx()認(rèn)識(shí)。如果調(diào)用strrchr("C:\\", '\\')函數(shù)可能會(huì)出錯(cuò),但 _mbsrchr()認(rèn)識(shí)雙字節(jié)字符,所以能返回指向最后出現(xiàn)反斜線字符的指針位置。

最后提一下strxxx() 和 _mbsxxx() 函數(shù)族中的字符串長度測量函數(shù),它們都返回字符串的字節(jié)數(shù)。如果字符串含有3個(gè)雙字節(jié)字符,_mbslen()將返回6。而Unicode的函數(shù)返回的是wchar_ts的數(shù)量,如wcslen(L"Bob") 返回3(本文開頭示例的出錯(cuò)原因 - 譯注)。 

下一篇重我們將要講述Win32 API中的MBCS 和 Unicode。


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
洋洋av久久久久久久一区| 亚洲欧美日韩人成在线播放| 丁香婷婷深情五月亚洲| 亚洲综合一区二区| 久久久久久黄色| 91精品蜜臀在线一区尤物| 99久久精品国产一区| 国产在线看一区| 五月天一区二区| 亚洲欧美另类久久久精品2019| 2024国产精品| 日韩三级视频在线看| 欧美影院一区二区| 一道本成人在线| 成人精品电影在线观看| 韩国一区二区视频| 免费在线成人网| 亚洲国产精品久久艾草纯爱| 国产精品初高中害羞小美女文| 精品国产伦一区二区三区免费| 欧美日韩在线播放一区| 99久久99久久精品国产片果冻| 国产不卡视频一区二区三区| 国精产品一区一区三区mba桃花 | 成人一区二区在线观看| 激情五月激情综合网| 日本网站在线观看一区二区三区| 亚洲亚洲精品在线观看| 一区二区三区精品| 一区二区三区欧美激情| 成人免费小视频| 亚洲欧美在线aaa| 国产精品理论在线观看| 日本一区二区三区在线不卡| 国产清纯白嫩初高生在线观看91 | 欧美乱妇15p| 日本黄色一区二区| 91精品1区2区| 欧美影院午夜播放| 欧美日韩一区 二区 三区 久久精品| 91久久精品国产91性色tv| 91丨九色porny丨蝌蚪| 成人精品小蝌蚪| 99久久久无码国产精品| 91蝌蚪porny| 欧美中文字幕一区二区三区 | 日韩综合小视频| 丝袜美腿亚洲一区| 麻豆精品视频在线观看免费| 日本不卡中文字幕| 九九国产精品视频| 国产馆精品极品| 成人白浆超碰人人人人| 99久久99久久精品国产片果冻| 色综合天天综合网天天看片| 欧美午夜精品免费| 69堂精品视频| 久久色在线观看| 国产精品福利一区| 亚洲国产欧美另类丝袜| 视频一区在线视频| 国产一区久久久| av激情综合网| 欧美情侣在线播放| 国产午夜精品久久久久久久| 亚洲色图清纯唯美| 日日摸夜夜添夜夜添国产精品| 久久精品国产一区二区三区免费看 | 欧美国产综合色视频| 亚洲黄色片在线观看| 日韩主播视频在线| 国产精品一区二区在线观看网站| 国产高清不卡一区二区| 色综合久久中文综合久久牛| 91久久精品日日躁夜夜躁欧美| 日韩三级在线观看| 国产精品国产三级国产| 午夜精品久久久久影视| 国产精品一区二区三区四区| 一本久道久久综合中文字幕| 制服丝袜一区二区三区| 国产日韩av一区| 日日摸夜夜添夜夜添亚洲女人| 国产精品99久久久久久久女警| 91福利视频久久久久| 亚洲精品在线网站| 亚洲永久免费av| 国产成人在线色| 91精品一区二区三区在线观看| 国产调教视频一区| 日韩精品久久理论片| 成人av在线播放网站| 日韩一级成人av| 亚洲另类在线一区| 国产制服丝袜一区| 精品奇米国产一区二区三区| 1024精品合集| 国产很黄免费观看久久| 9191精品国产综合久久久久久| 国产精品青草综合久久久久99| 日本成人在线看| 欧亚一区二区三区| 国产精品乱码人人做人人爱| 美女精品自拍一二三四| 色国产综合视频| 国产精品毛片久久久久久久| 久久成人免费电影| 欧美日韩成人综合天天影院 | 国产一区二区免费在线| 精品视频一区二区三区免费| 国产精品国产三级国产普通话99 | 91成人免费在线| 国产精品视频免费| 国产在线精品一区二区夜色| 色中色一区二区| 中文字幕一区二区三区色视频| 国产九色sp调教91| 欧美一级精品在线| 亚州成人在线电影| 欧美伊人久久大香线蕉综合69 | 中文字幕一区二区三区视频| 韩日av一区二区| 日韩免费观看高清完整版在线观看| 亚洲综合色噜噜狠狠| 色婷婷av一区二区三区之一色屋| 国产精品白丝在线| 成人黄色网址在线观看| 久久久久久久久99精品| 精品一区二区在线播放| 精品久久久久久最新网址| 蜜臀av亚洲一区中文字幕| 欧美精品三级日韩久久| 人人超碰91尤物精品国产| 欧美日韩国产另类一区| 亚洲va韩国va欧美va精品| 在线成人免费视频| 日韩国产精品久久| 91精品婷婷国产综合久久性色 | 精品对白一区国产伦| 蜜桃久久精品一区二区| 日韩精品资源二区在线| 狠狠色狠狠色综合| 国产偷国产偷精品高清尤物| 粉嫩蜜臀av国产精品网站| 欧美激情资源网| 91精品国产综合久久久久| 日本美女一区二区| 欧美成人官网二区| 国产精品一区二区在线看| 国产精品人人做人人爽人人添| 成人av电影在线网| 亚洲一区二区三区四区的| 欧美精品 国产精品| 激情亚洲综合在线| 国产精品免费免费| 91久久免费观看| 日韩不卡免费视频| 国产亚洲人成网站| gogo大胆日本视频一区| 亚洲一区二区三区四区中文字幕| 欧美久久久久久久久中文字幕| 精品在线一区二区三区| 久久久亚洲高清| 91麻豆免费看| 蜜桃精品视频在线观看| 国产精品人成在线观看免费| 91福利视频久久久久| 久久精品国产成人一区二区三区| 国产欧美日韩另类一区| 欧美性xxxxxxxx| 国精产品一区一区三区mba视频| 中文字幕电影一区| 555www色欧美视频| 国产成人av一区| 午夜精品视频在线观看| 欧美激情一区二区| 欧美欧美欧美欧美首页| 国产一区二区精品久久91| 亚洲欧美日韩国产成人精品影院| 91精品国产色综合久久不卡电影| 国产99久久久国产精品潘金| 亚洲成av人影院在线观看网| 国产亚洲精品精华液| 欧美日韩视频在线一区二区| 国产成人免费高清| 天堂av在线一区| 国产精品久久久久影视| 日韩一区二区在线观看视频| 色吧成人激情小说| 国内外成人在线视频| 亚洲444eee在线观看| 中文字幕一区免费在线观看| 日韩精品一区二区三区四区视频| 99久久精品情趣| 国内精品第一页| 亚洲bt欧美bt精品| 亚洲色图欧美激情| 久久精品一区二区三区四区| 欧美精品在线观看一区二区| 色综合亚洲欧洲|