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

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            国产精品成人久久久久久久| 办公室久久精品| 久久久久亚洲AV成人片| 日韩人妻无码精品久久免费一| 久久亚洲精品中文字幕| 国产激情久久久久影院老熟女免费 | 亚洲欧美国产日韩综合久久 | 久久精品中文无码资源站 | 久久精品国产免费观看| 久久久久久久久久久久久久| 久久99精品国产麻豆| 色婷婷噜噜久久国产精品12p | 亚洲国产成人久久精品动漫| 久久免费大片| yellow中文字幕久久网| 久久人爽人人爽人人片AV| 久久伊人五月天论坛| 久久99国产综合精品女同| 久久久国产99久久国产一| 狠狠干狠狠久久| 精品无码久久久久久午夜| 亚洲国产成人乱码精品女人久久久不卡| 久久丫精品国产亚洲av| 亚洲欧美一区二区三区久久| 免费国产99久久久香蕉| 久久精品水蜜桃av综合天堂| 久久久久久久久波多野高潮| 日韩va亚洲va欧美va久久| 99久久www免费人成精品| 69久久精品无码一区二区| 午夜精品久久久久久久久| 久久久精品久久久久影院| 伊人色综合久久天天网| 久久精品国产精品亚洲艾草网美妙| 久久国产高清字幕中文| 久久91精品久久91综合| 91精品国产9l久久久久| 久久精品黄AA片一区二区三区| 蜜臀av性久久久久蜜臀aⅴ | 国产真实乱对白精彩久久| 成人免费网站久久久|