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

            wchar_t

            關于wchar_t

            在C++標準中,wchar_t是寬字符類型,每個wchar_t類型占2個字節,16位寬。漢字的表示就要用到wchar_t 。char,我們都知道,占一個字節,8位寬。

            標準C++中的wprintf()函數以及iostream類庫中的類和對象能提供wchar_t寬字符類型的相關操作。

            locale loc( "chs" );//定義“區域設置”為中文方式
            wcout.imbue( loc );//載入中文字符輸入方式
            wchar_t str[]=L"中國";//定義寬字符數組,注意L是大寫
            wcout<<str<<endl;//顯示寬字符數組,下同
            wprintf(str);

            system("pause");

            wchar_t 轉換為char 的代碼如下:

            有如下的wchar_t和char變量

            wchar_t w_cn = '中';
            char c_cn[2] = {'0'} ;

            char *C2W(wchar_t w_cn , char c_cn[2])

            {

            //following code convert wchar to char
            c_cn[0] = w_cn >> 8 ;
            c_cn[1] = w_cn ;
            c_cn[2] = '\0';

            return c_cn ;

            }

            其中需要注意的是一個16位的wchar_t需要用兩個8位的char來存儲之。我們可以發現另外一個問題,wchar_t的高位字節應該存儲在char數組的低位字節。

            wchar_t *類型 轉為char *類型

             CString strName("listen");
             char *pcstr = (char *)new char[2 * strName.GetLength()+1] ;

             WideCharToMultiByte(   CP_ACP,  
              0,  
              strName,     //   要轉換的wchar_t*  
              -1,  
              pcstr,   //   接收char*的緩沖區指針  
              2 * strName.GetLength()+1,         //   pcstr的緩沖區的大小  
              NULL,  
              NULL   );

            關于system("command")

            system("command")是執行一個dos命令。system("pause")就是執行Dos命令pause,等待用戶輸入。
            system("pause") 與getchar()區別

            system("pause") 是調用WINDOWS CONSOLE APP下的命令 PAUSE的。
            system("const char*")就是調用WINDOWS CONSOLE APP下的命令。
            比如system("exit");
            system("ping 192.168.0.1")等等

            而getchar()只是C標準庫里等待一個字符的函數,兩者區別很大。

            /*---------------------------------------------------*/
            如何使system("pause") 不彈出“按任意鍵繼續”這幾個字呢?
            用system("pause>nul")  就可以了

            wchar_t*,wchar_t,wchat_t數組,char,char*,char數組,std::string,std::wstring,CString

            #include <string>
            // 使用CString必須使用MFC,并且不可包含<windows.h>
            #define _AFXDLL
            #include <afx.h>
            using namespace std;
            //----------------------------------------------------------------------------------
            //將 單字節char* 轉換為 寬字節 wchar*
            inline wchar_t* AnsiToUnicode( const char* szStr )
            {
            int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );
            if (nLen == 0)
            {
               return NULL;
            }
            wchar_t* pResult = new wchar_t[nLen];
            MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );
            return pResult;
            }
            //----------------------------------------------------------------------------------
            // 將 寬字節wchar_t* 轉換 單字節char*
            inline char* UnicodeToAnsi( const wchar_t* szStr )
            {
            int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );
            if (nLen == 0)
            {
               return NULL;
            }
            char* pResult = new char[nLen];
            WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );
            return pResult;
            }
            //----------------------------------------------------------------------------------
            // 將單字符 string 轉換為寬字符 wstring
            inline void Ascii2WideString( const std::string& szStr, std::wstring& wszStr )
            {
            int nLength = MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, NULL, NULL );
            wszStr.resize(nLength);
            LPWSTR lpwszStr = new wchar_t[nLength];
            MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, lpwszStr, nLength );
            wszStr = lpwszStr;
            delete [] lpwszStr;
            }
            //----------------------------------------------------------------------------------
            int _tmain(int argc, _TCHAR* argv[])
            {
            char*   pChar = "我喜歡char";
            wchar_t* pWideChar = L"我討厭wchar_t";
            wchar_t   tagWideCharList[100] ;
            char   ch = 'A';
            char   tagChar[100] = {NULL};
            CString   cStr;
            std::string str;

            // 注:設置語言環境以便輸出WideChar
            setlocale(LC_ALL,"chs");

            // 注: char* 轉換 wchar_t*
            // 注: wchar_t 未重載 << ,所以不可使用 cout << 輸出
            pWideChar = AnsiToUnicode( pChar );
            // 注:printf("%ls") 和 wprintf(L"%s") 一致
            printf( "%ls\n", pWideChar );

            // 注:wchar_t* 轉換 wchar_t[]
            wcscpy ( tagWideCharList, pWideChar );
            wprintf( L"%s\n", tagWideCharList );

            // 注:wchar_t[] 轉換 wchar_t*
            pWideChar = tagWideCharList;
            wprintf( L"%s\n", pWideChar );

            // 注:char 轉換 string
            str.insert( str.begin(), ch );
            cout << str << endl;

            // 注:wchar_t* 轉換 string
            pWideChar = new wchar_t[str.length()];
            swprintf( pWideChar, L"%s", str.c_str());
            wprintf( L"%s\n", pWideChar );

            // 注:string 轉換 char*
            pChar = const_cast<char*>(str.c_str());
            cout << pChar << endl;

            // 注:char* 轉換 string
            str = std::string(pChar);
            // 注: cout 的 << 重載了string, 若printf 的話必須 printf("%s", str.c_str());
            //   而不可 print( "%s", str ); 因為 str 是個 string 類
            cout << str << endl;

            // 注:string 轉換 char[]
            str = "無聊啊無聊";
            strcpy( tagChar, str.c_str() );
            printf( "%s\n", tagChar );

            // 注:string 轉換 CString;
            cStr = str.c_str();

            // 注:CString 轉換 string
            str = string(cStr.GetBuffer(cStr.GetLength()));

            // 注:char* 轉換 CString
            cStr = pChar;

            // 注:CString 轉換 char*
            pChar = cStr.GetBuffer( cStr.GetLength() );

            // 注:CString 轉換 char[]
            strncpy( tagChar, (LPCTSTR)CString, sizeof(tagChar));

            // 注:CString 轉換 wchar_t*
            pWideChar = cStr.AllocSysString();
            printf( "%ls\n", pWideChar );
            }

            WideCharToMultiByte()函數

              函數功能:該函數映射一個unicode字符串到一個多字節字符串。

              函數原型:int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPWSTR lpWideCharStr, int cchWideChar, LPCSTR lpMultiByteStr, int cchMultiByte, LPCSTR lpDefaultChar, PBOOL pfUsedDefaultChar );

              參數:

              CodePage:指定執行轉換的代碼頁,這個參數可以為系統已安裝或有效的任何代碼頁所給定的值。你也可以指定其為下面的任意一值:

              CP_ACP:ANSI代碼頁;CP_MACCP:Macintosh代碼頁;CP_OEMCP:OEM代碼頁;

              CP_SYMBOL:符號代碼頁(42);CP_THREAD_ACP:當前線索ANSI代碼頁;

              CP_UTF7:使用UTF-7轉換;CP_UTF8:使用UTF-8轉換。

              dwFlags:一組位標記用以指出是否未轉換成預作或寬字符(若組合形式存在),是否使用象形文字替代控制字符,以及如何處理無效字符。你可以指定下面是標記常量的組合,含義如下:

              MB_PRECOMPOSED:通常使用預作字符——就是說,由一個基本字符和一個非空字符組成的字符只有一個單一的字符值。這是缺省的轉換選擇。不能與

              MB_COMPOSITE值一起使用。

              MB_COMPOSITE:通常使用組合字符——就是說,由一個基本字符和一個非空字符組成的字符分別有不同的字符值。這是缺省的轉換選擇。不能與MB_PRECOMPOSED值一起使用。

              MB_ERR_INVALID_CHARS:如果函數遇到無效的輸入字符,它將運行失敗,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。

              MB_USEGLYPHCHARS:使用象形文字替代控制字符。

              組合字符由一個基礎字符和一個非空字符構成,每一個都有不同的字符值。每個預作字符都有單一的字符值給基礎/非空字符的組成。在字符è中,e就是基礎字符,而重音符標記就是非空字符。

              函數的缺省動作是轉換成預作的形式。如果預作的形式不存在,函數將嘗試轉換成組合形式。

              標記MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而標記MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS則不管其它標記如何都可以設置。

              lpWideCharStr:指向將被轉換的unicode字符串。

              cchWideChar:指定由參數lpWideCharStr指向的緩沖區的字符個數。如果這個值為-1,字符串將被設定為以NULL為結束符的字符串,并且自動計算長度。

              lpMultiByteStr:指向接收被轉換字符串的緩沖區。

              cchMultiByte:指定由參數lpMultiByteStr指向的緩沖區最大值(用字節來計量)。若此值為零,函數返回lpMultiByteStr指向的目標緩沖區所必需的字節數,在這種情況下,lpMultiByteStr參數通常為NULL。

              lpDefaultChar和pfUsedDefaultChar:只有當WideCharToMultiByte函數遇到一個寬字節字符,而該字符在uCodePage參數標識的代碼頁中并沒有它的表示法時,WideCharToMultiByte函數才使用這兩個參數。如果寬字節字符不能被轉換,該函數便使用lpDefaultChar參數指向的字符。如果該參數是NULL(這是大多數情況下的參數值),那么該函數使用系統的默認字符。該默認字符通常是個問號。這對于文件名來說是危險的,因為問號是個通配符。pfUsedDefaultChar參數指向一個布爾變量,如果Unicode字符串中至少有一個字符不能轉換成等價多字節字符,那么函數就將該變量置為TRUE。如果所有字符均被成功地轉換,那么該函數就將該變量置為FALSE。當函數返回以便檢查寬字節字符串是否被成功地轉換后,可以測試該變量。

              返回值:如果函數運行成功,并且cchMultiByte不為零,返回值是由 lpMultiByteStr指向的緩沖區中寫入的字節數;如果函數運行成功,并且cchMultiByte為零,返回值是接收到待轉換字符串的緩沖區所必需的字節數。如果函數運行失敗,返回值為零。若想獲得更多錯誤信息,請調用GetLastError函數。它可以返回下面所列錯誤代碼:

              ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS;

              ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。

              注意:指針lpMultiByteStr和lpWideCharStr必須不一樣。如果一樣,函數將失敗,GetLastError將返回ERROR_INVALID_PARAMETER的值。

            ANSI和UNICODE編碼

            二者都是字符代碼的一種表示形式

            ANSI編碼用0x88~0xFF范圍的2個字節來表示1個字符。

            Unicode編碼是國際組織指定的可以容納世界上所有文字和服的字符的字符編碼方案。用數字0~0x10FFFF來映射這些字符。

            我的理解:說白了,ANSI編碼是單字節,Unicode編碼是寬字符。


            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/chocolateconanlan/archive/2009/04/09/4058868.aspx

            posted on 2011-06-04 17:00 Hsssssss 閱讀(1475) 評論(0)  編輯 收藏 引用 所屬分類: C++知識

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            常用鏈接

            留言簿

            文章分類

            文章檔案

            收藏夾

            搜索

            最新評論

            日韩亚洲国产综合久久久| 久久九九兔免费精品6| 久久99精品久久久久久久久久| 久久久久亚洲AV成人网人人网站 | 午夜欧美精品久久久久久久| 少妇久久久久久久久久| 久久综合丁香激情久久| 久久无码国产| 99久久无码一区人妻a黑| 一级做a爰片久久毛片人呢| 久久婷婷色香五月综合激情| 99久久中文字幕| 亚洲日韩欧美一区久久久久我 | 久久国产精品无码HDAV| 日本久久久精品中文字幕| 要久久爱在线免费观看| 精品久久777| 亚洲综合伊人久久大杳蕉| 久久婷婷五月综合成人D啪 | 中文精品久久久久人妻| 国产韩国精品一区二区三区久久| 亚洲国产精品无码久久青草| 久久天堂电影网| 久久国产高潮流白浆免费观看| 中文字幕无码久久人妻| 99久久精品国产一区二区| 国产成人精品免费久久久久| 漂亮人妻被中出中文字幕久久 | 亚洲伊人久久大香线蕉综合图片| 伊人久久免费视频| 国产精品久久久久久影院| 亚洲中文字幕无码久久2020 | 99久久国语露脸精品国产| 精品久久亚洲中文无码| 欧美日韩精品久久久久 | 天天爽天天爽天天片a久久网| 久久久久亚洲AV无码观看| 久久精品国产久精国产一老狼| 国产69精品久久久久APP下载| 日本精品久久久久影院日本| 久久er国产精品免费观看8|