• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            C++的三種字符編碼方式

            c++通常使用的是三種編碼方式,分別是SBCS(single byte character set),MBCS(multi-byte characterset)Unicode字符集。SBCS是一個(gè)字節(jié)一個(gè)字符,MBCS是幾個(gè)字節(jié)一個(gè)字符,可能是一個(gè),兩個(gè),三個(gè)不等,但是實(shí)際上,絕大多數(shù)時(shí)候使用兩個(gè)字節(jié)的,所以有時(shí)候看到DBCS(double-byte character set)代替MBCS也不奇怪;Unicode一律是兩個(gè)字節(jié)編碼。在windows nt內(nèi)核中,API一律使用的是unicode編碼,所以如果你在編寫(xiě)軟件過(guò)程中使用非unicode編碼方式,系統(tǒng)也會(huì)自動(dòng)轉(zhuǎn)換成unicode執(zhí)行,然后返回的結(jié)構(gòu)再轉(zhuǎn)換為你使用的類(lèi)型。單字節(jié)表示用charunicode使用wchar_t.我們是在單字節(jié)的光芒下成長(zhǎng)起來(lái)的,一時(shí)間完全拋棄單字節(jié)未免難以接受,但是有些時(shí)候我們又不可避免的需要使用unicode字符集合,那么ms提供的解決辦法是泳宏:TChar

            我們看看他的定義:

            #ifdef UNICODE
            typedef wchar_t TCHAR;
            #else
            typedef char TCHAR;
            #endif

            ok,一切問(wèn)題都解決了,我們只需要定義UNICODE就一樣使用wchar_t,是很方便。另外,在windowsCOM中使用的一律是unicode,但是MFC默認(rèn)的確實(shí)MBCS,所以你用MFC寫(xiě)的類(lèi)庫(kù)如果放到了COM下,有些字符的格式化方式或者返回值錯(cuò)誤的,原因就是com一律使用unicode,而unicode使用wchar_t('00')結(jié)尾,char卻是使用'0'結(jié)尾的。一般情況下,普通字符需要加載_T宏才能正常運(yùn)行,比如MFC中你寫(xiě)道S = "FSDFSDF",那么該類(lèi)轉(zhuǎn)到COM下,需要寫(xiě)S = _T("FSDFSDF");才可以。我們可以想象宏_TTCHAr的功能一樣,如果使用UNICODE就自動(dòng)在constant string前面加上L,否則就直接使用。

            我們說(shuō)一些小問(wèn)題:

            VC6生成的console application
            int main(int argc, char* argv[])

            VS C++ 2005生成的是

            int _tmain(int argc, _TCHAR* argv[])

            顯然,用_tmain更好,why?

            You can also use _tmain, which is defined in TCHAR.h. _tmain will resolve to main unless _UNICODE is defined, in which case _tmain will resolve to wmain.(http://msdn2.microsoft.com/en-us/library/6wd819wh.aspx#).

            我們也會(huì)常常看到如下一些字符類(lèi)型,

            WCHAR wchar_t wchar_t
            LPSTR zero-terminated string of char (char*) zero-terminated string of char (char*)
            LPCSTR constant zero-terminated string of char (const char*) constant zero-terminated string of char (const char*)
            LPWSTR zero-terminated Unicode string (wchar_t*) zero-terminated Unicode string (wchar_t*)
            LPCWSTR constant zero-terminated Unicode string (const wchar_t*) constant zero-terminated Unicode string (const wchar_t*)
            TCHAR char wchar_t
            LPTSTR zero-terminated string of TCHAR (TCHAR*) zero-terminated string of TCHAR (TCHAR*)
            LPCTSTR constant zero-terminated string of TCHAR (const TCHAR*) constant zero-terminated string of TCHAR (const TCHAR*)
            C
            一般代表constantP代表指針,LP代表長(zhǎng)指針,W代表寬字符,也就是UNICODE,這下是不是都能明白這些是干什么的了?

            我們也會(huì)常常看到_mbsstr()這樣的函數(shù),這就是MBCS字符編碼的函數(shù),當(dāng)然可以處理SBCS編碼,但是反之卻不行。所以為了保險(xiǎn)起見(jiàn),我們可以使用_mbsstr代替strstr,但是如果程序只是處理SBCS,那么顯然又影響效率,所以到底用什么方式同時(shí)滿足效率和可移植性,自己掂量著辦吧。

            以后使用C++編寫(xiě)程序,如果出現(xiàn)亂碼,首先檢查C++的編碼類(lèi)型,而且一般情況下都是結(jié)束符號(hào)沒(méi)有弄對(duì),SBCSMBCS都是以單字節(jié)0結(jié)尾,UNICODE是以雙字節(jié)00結(jié)尾的。

             

            posted on 2008-11-07 23:27 肥仔 閱讀(987) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 字符編碼

            色青青草原桃花久久综合| 99久久无码一区人妻a黑| 亚洲精品高清一二区久久| 久久久久久国产a免费观看不卡 | 亚洲午夜久久久久久久久久| 亚洲国产另类久久久精品| 久久久综合九色合综国产| 伊人久久大香线蕉成人| 日本免费久久久久久久网站| 亚洲欧美成人久久综合中文网| 久久精品亚洲精品国产色婷| 久久乐国产精品亚洲综合| 97精品久久天干天天天按摩| 久久久国产99久久国产一| 久久免费线看线看| yy6080久久| 久久伊人影视| 国产精品狼人久久久久影院| 人妻精品久久无码专区精东影业| 久久精品免费网站网| 香港aa三级久久三级| 国产精品久久久久久久久| 亚洲午夜久久久影院伊人| 色播久久人人爽人人爽人人片AV| 国产精品成人精品久久久 | 国产精品一区二区久久精品无码| 久久AV高潮AV无码AV| 日产精品久久久久久久| 亚洲国产精品成人AV无码久久综合影院| 国产999精品久久久久久| 久久精品国产99国产电影网| 久久久久久久久久久久中文字幕 | 久久亚洲国产午夜精品理论片| 亚洲国产另类久久久精品小说 | 国产成人无码精品久久久性色| 久久av高潮av无码av喷吹| 国产精品伊人久久伊人电影 | 久久精品中文闷骚内射| 色综合久久综合中文综合网| 久久久久久伊人高潮影院| 伊人色综合久久天天人手人婷 |