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

            yehao's Blog

            解決為什么wcout不能輸出中文問題

            轉自http://www.cnblogs.com/moonz-wu/archive/2008/12/30/1365552.html

            wprintf 和 wcout

            這篇文章應該是[netsin]的成果,我勤快,記下來。
            注:wprintf是C的標準庫函數,但wcout不是C++的標準成員,C++中的 L"……" 是寬字符,卻未必是unicode字符,這與編譯器實現相關。
            [乾坤一笑]說:為什么 C/C++ 語言把 L"xx" 定義為由實現決定的呢?這顯然是為了 C/C++ 的普適性、可移植性。Bjarne 的觀點認為,C++ 的方式是允許程序員使用任何字符集作為串的字符類型。另外,unicode 編碼已經發展了若干版本了,是否能永久適合下去也不得而知。有關 unicode 的詳細論述以及和其它字符集的比較,我推薦你看《無廢話xml》。


            以下兩段代碼的執行環境是 windows xp professional 英文版,編譯器是 VS2005RTM。

            // C
            #include <stdio.h>
            #include <locale.h>
            int main( void )
            {
            setlocale( LC_ALL, "chs" );
            //setlocale( LC_ALL, "Chinese-simplified" );
            //setlocale( LC_ALL, "ZHI" );
            //setlocale( LC_ALL, ".936" );
            wprintf( L"中國" );

            return 0;
            }

            // C++
            #include <iostream>
            #include <locale>
            using namespace std;
            int main( void )
            {
            locale loc( "chs" );
            //locale loc( "Chinese-simplified" );
            //locale loc( "ZHI" );
            //locale loc( ".936" );
            wcout.imbue( loc );
            std::wcout << L"中國" << endl;

            return 0;
            }

            說明:別混合使用 setlocale 和 std::locale 。

            ------------------------- 2006-07-05 記 -------------------------

            "VC知識庫" 編碼為:56 43 D6 AA CA B6 BF E2 00 // ANSI編碼
            L"VC知識庫" 在VC++ 中編碼為:56 00 43 00 E5 77 C6 8B 93 5E 00 00 // (windows口中的unicode)編碼
            L"VC知識庫" 在GCC(Dev-CPP4990) 中編碼為:56 00 43 00 D6 00 AA 00 CA 00 B6 00 BF 00 E2 00 00 00 // 只是將ANSI編碼簡單的加0
            L"VC知識庫" 在GCC(Dev-CPP4992) 中編譯失敗,報 Illegal byte sequence

            L"VC知識庫" 在 Dev-CPP4992 中解決步驟為:
            a. 將文件保存為 utf-8 編碼 // utf-8 是unicode的其中一種,但和(windows口中的unicode)不一樣
            b. 去掉BOM頭:用二進制編輯器(比如VC)去掉剛才utf-8文件的前三個字節 // Linux/UNIX并不使用BOM
            c. 使用 gcc/g++ 編譯運行

            經過以上解決步驟,在 dev-cpp4992 中
            "VC知識庫" 編碼為: 56 43 E7 9F A5 E8 AF 86 E5 BA 93 00 // utf-8編碼,注意不再是ANSI編碼了,因此用 printf/cout 將輸出亂碼
            L"VC知識庫" 編碼為: 56 00 43 00 E5 77 C6 8B 93 5E 00 00 // (windows口中的unicode)編碼

            補充:在mingw32中使用wcout和wstring需要加一些宏,比如
            #define _GLIBCXX_USE_WCHAR_T 1
            #include <iostream>
            int main( void )
            {
            std::wcout << 1 << std::endl;
            }
            可以編譯通過,但無法Link通過,在網上google了一下,stlport說mingw32有問題,mingw32說是M$的c runtime有問題。

            ------------------------- 2007-01-05 記 -------------------------
            一個多字節字符串和寬字符字符串互相轉化的事例
            #define _CRT_SECURE_NO_WARNINGS // only for vc8
            #include <string>
            #include <clocale>
            #include <cassert>
            inline const std::string to_mbcs( const std::string& src )
            {
            return src;
            }
            const std::string to_mbcs( const std::wstring& src )
            {
            char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); // 保存原來的locale
            setlocale( LC_CTYPE, "chs" ); // 設置當前locale為chs,這在非簡體中文平臺上不可缺少

            size_t count1 = wcstombs( NULL, src.c_str(), 0 ); // 計算新字符串長度
            std::string des( count1, ' ' );
            size_t count2 = wcstombs( &des[0], src.c_str(), count1 ); // 轉化
            assert( count1 == count2 );

            setlocale( LC_CTYPE, old_locale ); // 恢復到原來的locale
            free( old_locale );

            return des;
            }
            inline const std::wstring to_wcs( const std::wstring& src )
            {
            return src;
            }
            const std::wstring to_wcs( const std::string& src )
            {
            char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); // 保存原來的locale
            setlocale( LC_CTYPE, "chs" ); // 設置當前locale為chs,這在非簡體中文平臺上不可缺少

            size_t count1 = mbstowcs( NULL, src.c_str(), 0 ); // 計算新字符串長度
            std::wstring des( count1, L' ' );
            size_t count2 = mbstowcs( &des[0], src.c_str(), count1 ); // 轉化
            assert( count1 == count2 );

            setlocale( LC_CTYPE, old_locale ); // 恢復到原來的locale
            free( old_locale );

            return des;
            }

            #include <iostream>
            int main( void )
            {
            using namespace std;

            cout << to_mbcs("你好1") << endl;
            cout << to_mbcs(L"你好2") << endl;

            const locale loc( "chs" );
            wcout.imbue( loc );
            wcout << to_wcs("你好3") << endl;
            wcout << to_wcs(L"你好4") << endl;
            }

            ------------------------- 2008-09-03 記 -------------------------
            參見 《MBCS To Unicode

            將想法付諸于實踐,借此來影響他人是一個人存在的真正價值

            posted on 2015-03-05 15:36 厚積薄發 閱讀(5627) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            導航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            99热成人精品免费久久| 亚洲一区精品伊人久久伊人| 久久久久AV综合网成人| 99久久人妻无码精品系列| 大美女久久久久久j久久| 久久精品国产99国产精品导航 | 国内精品久久久久久99| 国产午夜精品久久久久九九电影| 亚洲精品第一综合99久久| 国产一久久香蕉国产线看观看 | 久久久久人妻一区二区三区vr| 国产精品一久久香蕉产线看| 久久综合伊人77777麻豆| 97久久精品无码一区二区| 中文字幕久久亚洲一区| 久久久久国产一级毛片高清版| 久久综合色老色| 91精品国产91久久| 77777亚洲午夜久久多喷| 久久久久亚洲av成人网人人软件| 国产午夜电影久久| 国内精品久久国产大陆| 亚洲AV日韩AV天堂久久| 伊人久久五月天| 中文精品99久久国产| 久久久久国产日韩精品网站| 久久久久久a亚洲欧洲aⅴ| 久久久久99精品成人片试看| 国产精品成人久久久| 国产精品久久新婚兰兰| 伊人久久精品影院| 伊人久久一区二区三区无码| 亚洲精品成人久久久| 日韩亚洲国产综合久久久| 蜜臀久久99精品久久久久久| 久久成人18免费网站| 欧美色综合久久久久久| 久久这里的只有是精品23| 久久久久亚洲精品日久生情 | 久久久综合九色合综国产| 2020久久精品国产免费|