• <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>
            隨筆 - 89  文章 - 118  trackbacks - 0
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            留言簿(16)

            隨筆分類(56)

            隨筆檔案(89)

            文章分類

            推薦博客

            搜索

            •  

            最新隨筆

            最新評論

            閱讀排行榜


            posted @ 2008-05-26 10:14 胡滿超 閱讀(1597) | 評論 (3)編輯 收藏
            有一個單鏈表,其中可能有一個環,也就是某個節點的next指向的是鏈表中在它之前的節點,這樣在鏈表的尾部形成一環。

            問題:

            1、如何判斷一個鏈表是不是這類鏈表?
            2、如果鏈表為存在環,如何找到環的入口點?

            解答:

            一、判斷鏈表是否存在環,辦法為:

            設置兩個指針(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鏈表存在環,則fast必定先進入環,而slow后進入環,兩個指針必定相遇。(當然,fast先行頭到尾部為NULL,則為無環鏈表)程序如下:

            bool IsExitsLoop(slist *head)
            {
                slist
            *slow = head*fast = head;

                while ( fast && fast->next ) 
                {
                    slow 
            = slow->next;
                    fast 
            = fast->next->next;
                   
            if ( slow == fast ) break;
                }

                return !(fast == NULL || fast->next == NULL);
            }

            二、找到環的入口點

            當fast若與slow相遇時,slow肯定沒有走遍歷完鏈表,而fast已經在環內循環了n圈(1<=n)。假設slow走了s步,則fast走了2s步(fast步數還等于s 加上在環上多轉的n圈),設環長為r,則:

            2s = s + nr
            s= nr

            設整個鏈表長L,入口環與相遇點距離為x,起點到環入口點的距離為a。
            a + x = nr
            a + x = (n – 1)r +r = (n-1)r + L - a
            a = (n-1)r + (L – a – x)

            (L – a – x)為相遇點到環入口點的距離,由此可知,從鏈表頭到環入口點等于(n-1)循環內環+相遇點到環入口點,于是我們從鏈表頭、與相遇點分別設一個指針,每次各走一步,兩個指針必定相遇,且相遇第一點為環入口點。程序描述如下:

            slist* FindLoopPort(slist *head)
            {
                slist
            *slow = head, *fast = head;

                while ( fast && fast->next ) 
                {
                    slow 
            = slow->next;
                    fast 
            = fast->next->next;
                   
            if ( slow == fast ) break;
                }

                if (fast == NULL || fast->next == NULL)
               
                return NULL;

                slow 
            = head;
                while (slow != fast)
                {
                     slow 
            = slow->next;
                     fast 
            = fast->next;
                }

                return slow;
            }


            擴展問題:

            判斷兩個單鏈表是否相交,如果相交,給出相交的第一個點(兩個鏈表都不存在環)。

            比較好的方法有兩個:

            一、將其中一個鏈表首尾相連,檢測另外一個鏈表是否存在環,如果存在,則兩個鏈表相交,而檢測出來的依賴環入口即為相交的第一個點。

            二、如果兩個鏈表相交,那個兩個鏈表從相交點到鏈表結束都是相同的節點,我們可以先遍歷一個鏈表,直到尾部,再遍歷另外一個鏈表,如果也可以走到同樣的結尾點,則兩個鏈表相交。

            這時我們記下兩個鏈表length,再遍歷一次,長鏈表節點先出發前進(lengthMax-lengthMin)步,之后兩個鏈表同時前進,每次一步,相遇的第一點即為兩個鏈表相交的第一個點。



            posted @ 2008-04-17 10:21 胡滿超 閱讀(34815) | 評論 (23)編輯 收藏
                 摘要: 有一個二維數組,0表示路,-1表示墻,求其中任意兩點的最短路徑。 我們先看,怎么求一條路徑:求兩點路徑是一個數據結構上的典型的迷宮問題,很多數據結構的書上都有介紹,解決辦法如下: 從一點開始出發,向四個方向查找,每走一步,把走過的點的值+1(即本節點值+1),防止重復行走,并把走過的點壓入堆棧(表示路徑),如果遇到墻、或者已走過的點則不能前進,如果前方已經無路可走,則返回,路徑退棧,這樣遞歸調...  閱讀全文
            posted @ 2008-03-18 17:47 胡滿超 閱讀(8903) | 評論 (4)編輯 收藏
            曾經遇到一個為二維數組循環賦值的問題,即賦值后的二維數組為如下情形:



            當時在網上找了一下答案,基本上都是1層大循環套4層小循環還實現的,感覺不夠優雅。最近翻了一下數據結構的書,看到迷宮問題受到了一點啟發,感覺同樣是實現這個功能,如下代碼要優雅一些:


            const 
            int ROW__ = 10;
            const 
            int COL__ = 10;
            int mat[ROW__][COL__];

            struct Position
            {
                
            int    nRow;
                
            int nCol;
            };

            void printMat(int mat[ROW__][COL__]);

            int main(int argc, char* argv[])
            {
                Position offset[
            4];
                offset[
            0].nRow = 0;        offset[0].nCol = 1;
                offset[
            1].nRow = 1;        offset[1].nCol = 0;
                offset[
            2].nRow = 0;        offset[2].nCol = -1;
                offset[
            3].nRow = -1;    offset[3].nCol = 0;

                Position curPos;
                curPos.nRow 
            = 0;
                curPos.nCol 
            = 0;
                mat[
            0][0= 1;

                
            int nOffset = 0;

                Position tempPos;
                
            for (int i = 1; i < ROW__*COL__; i++)
                {
                    
            // nOffset % 4 ------> 右->下->左->上 循環
                    tempPos.nRow = curPos.nRow + offset[nOffset % 4].nRow;
                    tempPos.nCol 
            = curPos.nCol + offset[nOffset % 4].nCol;

                    
            if (   tempPos.nRow >= ROW__ || tempPos.nRow < 0
                        
            || tempPos.nCol >= COL__ || tempPos.nCol < 0    // 不超過邊界
                        || mat[tempPos.nRow][tempPos.nCol] > 0)         // 已經有值
                    {
                        i
            --;        
                        nOffset
            ++;
                        
            continue;
                    }

                    curPos 
            = tempPos;
                    mat[curPos.nRow][curPos.nCol] 
            = i+1;
                }

                printMat(mat);

                
            return 0;
            }


            printMat函數這些就不提供了,它的功能是打印出這個數組。我上傳了一下工程,有興趣的朋友點此下載

            posted @ 2008-03-04 10:30 胡滿超 閱讀(4831) | 評論 (2)編輯 收藏
            剛剛有人考了我一道題,逆序輸出單鏈表:
            我是這樣答的(下面的代碼為偽代碼,不能通過編譯):

            void printSList(slist *pList)
            {
                assert(pList);
                
            if (pList == NULL)
                    
            return;

                string str;
                
            while (pList)
                {
                    str 
            = string(*pList) + str;
                    pList 
            = pList->next;
                }

                printf(
            "%s", str.c_str());
            }

            后來他讓我想一想還有沒有更為簡單的方法了,當時允許我上網,我用了幾分鐘到網上找了一下,沒有找到更好的辦法,如果先把鏈表逆序,再順序輸出時間復雜度更高。

            我走出大樓以后,忽然想到,是遞歸呀,對是遞歸:

            void printSList(slist *pList)
            {
                assert(pList);
                
            if (pList == NULL)
                    
            return;
                
                
            if (pList->next == NULL)
                    printf(
            "%s"*pList);
                
            else
                {
                    printSList(pList
            ->next);
                    printf(
            "%s"*pList);
                }
            }

            哎,人生中機會就是一瞬之間,錯過不知道下一次又是什么時候。但只要做了就會收獲,會一次比一次做的好。吃飯去了...


            posted @ 2008-02-29 11:43 胡滿超 閱讀(10377) | 評論 (19)編輯 收藏
            1000毫秒為一秒,毫秒可能是能夠取到的最小的時間單位了,代碼如下:


            1 DWORD startTime = GetTickCount();
            2 // do something
            3 DWORD totalTime = GetTickCount() - startTime;

            看到樓下兩們仁兄的發言,我找了一下資料,如下的代碼可以取得更為精確的時間值:

             1 // 取得時鐘頻率
             2 LARGE_INTEGER  litmp ;
             3 QueryPerformanceFrequency(&litmp);
             4     
             5 LARGE_INTEGER  start;
             6 QueryPerformanceCounter(&start) ; 
             7 
             8 //do something
             9 
            10 LARGE_INTEGER  end;
            11 QueryPerformanceCounter(&end) ; 
            12
            13 double dTotalTime = (double)(end.QuadPart-start.QuadPart) / (double)litmp.QuadPart;    //秒
            14 

            posted @ 2008-02-27 10:42 胡滿超 閱讀(9843) | 評論 (4)編輯 收藏
            一年半之前,我遇到一個問題:把一堆數平均分成N份,保證每一份的和接近于所有數之和除以N,不要求平分以后的每份數據個數相等。這是有現實的程序設計需求的,當時是3份。首先想到要先進行排序,再依次從已排序的數列中抽取,如何進行抽取方法有很多,我大概想了3種左右,感覺要拿一些數據去測試一下這幾種方法哪一種可以逼近最優解。

            當時經理要求算法一定能夠得出最優解,但測試多組數據,沒有發現哪一種實現能得到最優解。后來翻了一下數據結構、算法與應用--C++語言描述,忽然想到,原來這個是一個典型貪婪算法問題,這個問題沒有最優解,用貪婪算法來解決這個問題可以讓每一次結果逼近最優。實現如下(注:代碼是我今天寫的):

            typedef vector<int>       IntVector;
            typedef vector
            <IntVector> IntMat;

            void DeuceNumber(const IntVector &SourceVecNum,
                             const 
            int       nShare,
                             IntMat          
            &OutVecVecNum)
            {
                IntVector copySourceNum 
            = SourceVecNum;
                sort(copySourceNum.begin(), copySourceNum.end(), greater
            <int>());

                IntVector sum(nShare);
                OutVecVecNum.resize(nShare);

                
            for (int i = 0; i < copySourceNum.size(); i++)
                {
                    const 
            int nMinSumPos     = min_element(sum.begin(), sum.end()) - sum.begin();
                    OutVecVecNum[nMinSumPos].push_back(copySourceNum[i]);
                    sum         [nMinSumPos] 
            += copySourceNum[i];
                }
            }

            我上傳了一個VC的測試工程,有興趣的朋友點此下載

            理論的依據不僅指導了實踐的選擇,同時給選擇以有力的支撐。

            2007年就要結束了,在此預祝大家在新的一年里:身體健康,平安如意!
            posted @ 2007-12-29 15:52 胡滿超 閱讀(4166) | 評論 (12)編輯 收藏


            假設需要執行的程序如下:


            int main(int argc, char* argv[])
            {
                
            return argc;
            }


            執行它,并取得其返回值,我寫了一個函數如下:

            DWORD         WinExecAndWait32(    LPCTSTR lpszAppPath,   // 執行程序的路徑
                                            LPCTSTR lpParameters,  // 參數
                                            LPCTSTR lpszDirectory, // 執行環境目錄
                                            DWORD dwMilliseconds)  // 最大等待時間, 超過這個時間強行終止
            {
                SHELLEXECUTEINFO ShExecInfo 
            = {0};
                ShExecInfo.cbSize    
            = sizeof(SHELLEXECUTEINFO);
                ShExecInfo.fMask    
            = SEE_MASK_NOCLOSEPROCESS;
                ShExecInfo.hwnd        
            = NULL;
                ShExecInfo.lpVerb    
            = NULL;
                ShExecInfo.lpFile    
            = lpszAppPath;        
                ShExecInfo.lpParameters 
            = lpParameters;    
                ShExecInfo.lpDirectory    
            = lpszDirectory;
                ShExecInfo.nShow    
            = SW_HIDE;
                ShExecInfo.hInstApp 
            = NULL;    
                ShellExecuteEx(
            &ShExecInfo);

                
            // 指定時間沒結束
                if (WaitForSingleObject(ShExecInfo.hProcess, dwMilliseconds) == WAIT_TIMEOUT)
                {    
            // 強行殺死進程
                    TerminateProcess(ShExecInfo.hProcess, 0);
                    
            return 0;    //強行終止
                }

                DWORD dwExitCode;
                BOOL bOK 
            = GetExitCodeProcess(ShExecInfo.hProcess, &dwExitCode);
                ASSERT(bOK);

                
            return dwExitCode;
            }

            我上傳了兩個工程,希望對大家有所幫助!

            http://m.shnenglu.com/Files/humanchao/ExecExe.rar

            posted @ 2007-12-28 11:20 胡滿超 閱讀(5969) | 評論 (4)編輯 收藏
                   字符是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。字符集是多個字符的集合,字符集種類較多,每個字符集包含的字符個數不同,常見字符集名稱:ASCII字符集、GB2312字符集、BIG5字符集、 GB 18030字符集、Unicode字符集等。計算機要準確的處理各種字符集文字,需要進行字符編碼,以便計算機能夠識別和存儲各種文字。

            中文文字數目大,而且還分為簡體中文和繁體中文兩種不同書寫規則的文字,而計算機最初是按英語單字節字符設計的,因此,對中文字符進行編碼,是中文信息交流的技術基礎。本文將按照字符集的時間順序討論幾種典型的字符集,選取幾種代表性的中文字符集,研究歷史由來、特點、技術特征。

             

            漢字編碼范圍

            名稱 第一字節 第二字節

            GB2312 0xB0-0xF7(176-247)    0xA0-0xFE(160-254)

            GBK 0x81-0xFE(129-254)     0x40-0xFE(64-254)

            Big5 0x81-0xFE(129-255)     0x40-0x7E(64-126)

            0xA1-0xFE(161-254)

             

            ASCII 字符集

            1.名稱的由來

            ASCII(American Standard Code for Information Interchange,美國信息互換標準代碼)是基于羅馬字母表的一套電腦編碼系統。

            2.特點

            它主要用于顯示現代英語和其他西歐語言。它是現今最通用的單字節編碼系統,并等同于國際標準ISO 646。

            3.包含內容

            控制字符:回車鍵、退格、換行鍵等。

            可顯示字符:英文大小寫字符、阿拉伯數字和西文符號

            4.技術特征

            7位(bits)表示一個字符,共128字符

            5.ASCII擴展字符集

            7位編碼的字符集只能支持128個字符,為了表示更多的歐洲常用字符對ASCII進行了擴展,ASCII擴展字符集使用8位(bits)表示一個字符,共256字符。

            ASCII擴展字符集比ASCII字符集擴充出來的符號包括表格符號、計算符號、希臘字母和特殊的拉丁符號。

             

            GB2312 字符集

             1.名稱的由來

            GB2312又稱為GB2312-80字符集,全稱為《信息交換用漢字編碼字符集·基本集》,由原中國國家標準總局發布,1981年5月1日實施。

            2.特點

            GB2312是中國國家標準的簡體中文字符集。它所收錄的漢字已經覆蓋99.75%的使用頻率,基本滿足了漢字的計算機處理需要。在中國大陸和新加坡獲廣泛使用。

            3.包含內容

            GB2312收錄簡化漢字及一般符號、序號、數字、拉丁字母、日文假名、希臘字母、俄文字母、漢語拼音符號、漢語注音字母,共 7445 個圖形字符。其中包括6763個漢字,其中一級漢字3755個,二級漢字3008個;包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西里爾字母在內的682個全角字符。

            4.技術特征

            (1)分區表示:

            GB2312中對所收漢字進行了“分區”處理,每區含有94個漢字/符號。這種表示方式也稱為區位碼。

            各區包含的字符如下:01-09區為特殊符號;16-55區為一級漢字,按拼音排序;56-87區為二級漢字,按部首/筆畫排序;10-15區及88-94區則未有編碼。

            (2)雙字節表示

            兩個字節中前面的字節為第一字節,后面的字節為第二字節。習慣上稱第一字節為“高字節” ,而稱第二字節為“低字節”。

            “高位字節”使用了0xA1-0xF7 (把01-87區(88-94區未有編碼)的區號加上0xA0),“低位字節”使用了0xA1-0xFE (把01-94加上0xA0)。

            5.編碼舉例

            以GB2312字符集的第一個漢字“啊”字為例,它的區號16,位號01,則區位碼是1601,在大多數計算機程序中,高字節和低字節分別加0xA0得到程序的漢字處理編碼0xB0A1。計算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。

             

            GBK 字符集

            1.名稱的由來

            GBK是GB2312的擴展,是向上兼容的,因此GB2312中的漢字的編碼與GBK中漢字的相同。另外,GBK中還包含繁體字的編碼,它與Big5編碼之間的關系我還沒有弄明白,好像是不一致的。

            2. 特點

            GBK中每個漢字仍然包含兩個字節,第一個字節的范圍是0x81-0xFE(即129-254),第二個字節的范圍是0x40-0xFE(即64-254)。GBK中有碼位23940個,包含漢字21003個。

            BIG5 字符集

            1.名稱的由來

            又稱大五碼或五大碼,1984年由臺灣財團法人信息工業策進會和五間軟件公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大眾 (FIC)創立,故稱大五碼。

            Big5碼的產生,是因為當時臺灣不同廠商各自推出不同的編碼,如倚天碼、IBM PS55、王安碼等,彼此不能兼容;另一方面,臺灣政府當時尚未推出官方的漢字編碼,而中國大陸的GB2312編碼亦未有收錄繁體中文字。

            2.特點

            Big5字符集共收錄13,053個中文字,該字符集在中國臺灣使用。耐人尋味的是該字符集重復地收錄了兩個相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC)。

            3.字符編碼方法

            Big5碼使用了雙字節儲存方法,以兩個字節來編碼一個字。第一個字節稱為“高位字節”,第二個字節稱為“低位字節”。高位字節的編碼范圍0xA1-0xF9,低位字節的編碼范圍0x40-0x7E及0xA1-0xFE。

            各編碼范圍對應的字符類型如下:0xA140-0xA3BF為標點符號、希臘字母及特殊符號,另外于0xA259-0xA261,存放了雙音節度量衡單位用字:兙兛兞兝兡兣嗧瓩糎;0xA440-0xC67E為常用漢字,先按筆劃再按部首排序;0xC940-0xF9D5為次常用漢字,亦是先按筆劃再按部首排序。

            4.Big5 的局限性

            盡管Big5碼內包含一萬多個字符,但是沒有考慮社會上流通的人名、地名用字、方言用字、化學及生物科等用字,沒有包含日文平假名及片假名字母。

            例如臺灣視“著”為“著”的異體字,故沒有收錄“著”字。康熙字典中的一些部首用字(如“亠”、“疒”、“辵”、“癶”等)、常見的人名用字(如“堃”、“煊”、“栢”、“喆”等) 也沒有收錄到Big5之中。

             

            GB18030 字符集

            1.名稱的由來

            GB 18030的全稱是GB18030-2000《信息交換用漢字編碼字符集基本集的擴充》,是我國政府于2000年3月17日發布的新的漢字編碼國家標準,2001年8月31日后在中國市場上發布的軟件必須符合本標準

            2.特點

            GB 18030字符集標準的出臺經過廣泛參與和論證,來自國內外知名信息技術行業的公司,信息產業部和原國家質量技術監督局聯合實施。

            GB 18030字符集標準解決漢字、日文假名、朝鮮語和中國少數民族文字組成的大字符集計算機編碼問題。該標準的字符總編碼空間超過150萬個編碼位,收錄了27484個漢字,覆蓋中文、日文、朝鮮語和中國少數民族文字。滿足中國大陸、香港、臺灣、日本和韓國等東亞地區信息交換多文種、大字量、多用途、統一編碼格式的要求。并且與Unicode 3.0版本兼容,填補Unicode擴展字符字匯“統一漢字擴展A”的內容。并且與以前的國家字符編碼標準(GB2312,GB13000.1)兼容。

            3.編碼方法

            GB 18030標準采用單字節、雙字節和四字節三種方式對字符編碼。單字節部分使用0×00至0×7F碼(對應于ASCII碼的相應碼)。雙字節部分,首字節碼從0×81至0×FE,尾字節碼位分別是0×40至0×7E和0×80至0×FE。四字節部分采用GB/T 11383未采用的0×30到0×39作為對雙字節編碼擴充的后綴,這樣擴充的四字節編碼,其范圍為0×81308130到0×FE39FE39。其中第一、三個字節編碼碼位均為0×81至0×FE,第二、四個字節編碼碼位均為0×30至0×39。

            4.包含的內容

            雙字節部分收錄內容主要包括GB13000.1全部CJK漢字20902個、有關標點符號、表意文字描述符13個、增補的漢字和部首/構件80個、雙字節編碼的歐元符號等。  四字節部分收錄了上述雙字節字符之外的,包括CJK統一漢字擴充A在內的GB 13000.1中的全部字符。

             

            對漢字進行hash

                為了處理漢字的方便,在查找漢字的時候,我們通常會用到hash的方法,那怎么來確定一個漢字位置呢?這就和每種編碼的排列有關了,這里主要給出一種hash函數的策略。

                對于GB2312編碼,設輸入的漢字為GBword,我們可以采用公式(C1-176)*94 + (C2-161)確定GBindex。其中,C1表示第一字節,C2表示第二字節。具體如下:

                GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161;

                之所以用unsigned char類型,是因為char是一個字節,如果用unsigend int,因為int是4個字節的,所以會造成擴展,導致錯誤。

                   對于GBK編碼,設輸入的漢字為GBKword,則可以采用公式   index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128),其中ch1是第一字節,ch2是第二字節。

                具體的,

                GBKindex = ((unsigned char)GBKword[0]-129)*190 +

                           ((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;

             

            怎樣判斷一個漢字的是什么編碼

            直接根據漢字的編碼范圍判斷,對于GB2312和GBK可用下面兩個程序實現。

            1、判斷是否是GB2312

            bool isGBCode(const string& strIn)

            {

                unsigned char ch1;

                unsigned char ch2;

               

                if (strIn.size() >= 2)

                {

                    ch1 = (unsigned char)strIn.at(0);

                    ch2 = (unsigned char)strIn.at(1);

                    if (ch1>=176 && ch1<=247 && ch2>=160 && ch2<=254)

                        return true;

                    else return false;

                }

                else return false;

            }

            2、判斷是否是GBK編碼

            bool isGBKCode(const string& strIn)

            {

                unsigned char ch1;

                unsigned char ch2;

               

                if (strIn.size() >= 2)

                {

                    ch1 = (unsigned char)strIn.at(0);

                    ch2 = (unsigned char)strIn.at(1);

                    if (ch1>=129 && ch1<=254 && ch2>=64 && ch2<=254)

                        return true;

                    else return false;

                }

                else return false;

            }

             

            3、對于Big5

                它的范圍為:高字節從0xA0到0xFE,低字節從0x40到0x7E,和0xA1到0xFE兩部分。判斷一個漢字是否是BIG5編碼,可以如上對字符的編碼范圍判斷即可。如何定位呢?那么也想象所有編碼排列為一個二維坐標,縱坐標是高字節,橫坐標是低字節。這樣一行上的漢字個數:(0x7E-0x40+1)+(0xFE-0xA1+1)=157。那么定位算法分兩塊,為: 

                if 0x40<=ch2<=0x7E: #is big5 char

                index=((ch1-0xA1)*157+(ch2-0x40))*2

                elif 0xA1<=ch2<=0xFE: #is big5 char

                index=((ch1-0xA1)*157+(ch2-0xA1+63))*2

             

            對于第二塊,計算偏移量時因為有兩塊數值,所以在計算后面一段值時,不要忘了前面還有一段值。0x7E-0x40+1=63。

             

            如果判斷一個字符是西文字符還是中文字符

                大家知道西文字符主要是指ASCII碼,它用一個字節表示。且這個字符轉換成數字之后,該數字是大于0的,而漢字是兩個字節的,第一個字節的轉化為數字之后應該是小于0的,因此可以根據每個字節轉化為數字之后是否小于0,判斷它是否是漢字。

                例如,設輸入字為strin,則,

                 If (strin.at(0) < 0)

                   cout << ”是漢字” << endl;

                 else cout << ”不是漢字” << endl;

             

            編碼表

             

             

            Unicode字符集

            1.名稱的由來

            Unicode字符集編碼是Universal Multiple-Octet Coded Character Set 通用多八位編碼字符集的簡稱,是由一個名為 Unicode 學術學會(Unicode Consortium)的機構制訂的字符編碼系統,支持現今世界各種不同語言的書面文本的交換、處理及顯示。該編碼于1990年開始研發,1994年正式公布,最新版本是2005年3月31日的Unicode 4.1.0。

            2.特征

            Unicode是一種在計算機上使用的字符編碼。它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。

            3.編碼方法

            Unicode 標準始終使用十六進制數字,而且在書寫時在前面加上前綴“U+”,例如字母“A”的編碼為 004116 和字符“?”的編碼為 20AC16。所以“A”的編碼書寫為“U+0041”。

            4.UTF-8 編碼

            UTF-8是Unicode的其中一個使用方式。 UTF是 Unicode Translation Format,即把Unicode轉做某種格式的意思。

            UTF-8便于不同的計算機之間使用網絡傳輸不同語言和編碼的文字,使得雙字節的Unicode能夠在現存的處理單字節的系統上正確傳輸。

            UTF-8使用可變長度字節來儲存 Unicode字符,例如ASCII字母繼續使用1字節儲存,重音文字、希臘字母或西里爾字母等使用2字節來儲存,而常用的漢字就要使用3字節。輔助平面字符則使用4字節。

            5.UTF-16 和 UTF-32 編碼

            UTF-32、UTF-16 和 UTF-8 是 Unicode 標準的編碼字符集的字符編碼方案,UTF-16 使用一個或兩個未分配的 16 位代碼單元的序列對 Unicode 代碼點進行編碼;UTF-32 即將每一個 Unicode 代碼點表示為相同值的 32 位整數

            posted @ 2007-09-27 09:28 胡滿超 閱讀(2374) | 評論 (0)編輯 收藏
            僅列出標題
            共5頁: 1 2 3 4 5 
            国产精品久久婷婷六月丁香| 国产精品99久久精品| 久久国产精品免费一区| 久久综合九色综合欧美就去吻| 日韩久久久久中文字幕人妻| 久久午夜无码鲁丝片秋霞| 久久婷婷五月综合色奶水99啪| 久久香蕉国产线看观看99| 国产美女久久精品香蕉69| 中文字幕一区二区三区久久网站| 久久黄视频| 久久久久久无码Av成人影院| 激情综合色综合久久综合| 色综合久久久久综合体桃花网| 9999国产精品欧美久久久久久| 一本久久综合亚洲鲁鲁五月天| 国产成人无码久久久精品一| 久久国内免费视频| 久久久久亚洲爆乳少妇无| 久久久久亚洲AV片无码下载蜜桃| 久久亚洲国产精品123区| 色综合色天天久久婷婷基地| 久久久精品人妻一区二区三区蜜桃 | 国产一区二区精品久久岳| 男女久久久国产一区二区三区| 久久久久黑人强伦姧人妻| 久久ww精品w免费人成| 亚洲精品乱码久久久久久| 久久久亚洲精品蜜桃臀| 国产成人精品久久亚洲| 精品久久久久久综合日本| 国内精品久久久久久久97牛牛| 亚洲AV无码久久精品狠狠爱浪潮| 区久久AAA片69亚洲| 亚洲精品综合久久| 亚洲午夜无码久久久久小说| 亚洲精品tv久久久久| 亚洲日韩欧美一区久久久久我| 日本欧美国产精品第一页久久| 丁香久久婷婷国产午夜视频| 国产成人久久777777|