• <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不能輸出中文問題

            轉(zhuǎn)自http://www.cnblogs.com/moonz-wu/archive/2008/12/30/1365552.html

            wprintf 和 wcout

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


            以下兩段代碼的執(zhí)行環(huán)境是 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知識(shí)庫" 編碼為:56 43 D6 AA CA B6 BF E2 00 // ANSI編碼
            L"VC知識(shí)庫" 在VC++ 中編碼為:56 00 43 00 E5 77 C6 8B 93 5E 00 00 // (windows口中的unicode)編碼
            L"VC知識(shí)庫" 在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知識(shí)庫" 在GCC(Dev-CPP4992) 中編譯失敗,報(bào) Illegal byte sequence

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

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

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

            ------------------------- 2007-01-05 記 -------------------------
            一個(gè)多字節(jié)字符串和寬字符字符串互相轉(zhuǎn)化的事例
            #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" ); // 設(shè)置當(dāng)前l(fā)ocale為chs,這在非簡體中文平臺(tái)上不可缺少

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

            setlocale( LC_CTYPE, old_locale ); // 恢復(fù)到原來的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" ); // 設(shè)置當(dāng)前l(fā)ocale為chs,這在非簡體中文平臺(tái)上不可缺少

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

            setlocale( LC_CTYPE, old_locale ); // 恢復(fù)到原來的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

            將想法付諸于實(shí)踐,借此來影響他人是一個(gè)人存在的真正價(jià)值

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

            導(dǎo)航

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

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評(píng)論

            国产毛片欧美毛片久久久| 久久性精品| 成人久久综合网| 91久久成人免费| 伊人久久大香线蕉AV一区二区| 蜜桃麻豆www久久国产精品| 2021国产精品久久精品| 99久久超碰中文字幕伊人| 久久精品国产99久久久香蕉| 久久精品国产男包| 岛国搬运www久久| 亚洲精品乱码久久久久久中文字幕 | 99久久亚洲综合精品成人| 久久久久无码精品国产app| 久久精品国产亚洲AV蜜臀色欲| 久久精品国产一区| 色妞色综合久久夜夜| 久久e热在这里只有国产中文精品99| 91麻豆国产精品91久久久| 亚洲伊人久久大香线蕉苏妲己| 日韩精品久久久久久久电影| 国产69精品久久久久99尤物| 浪潮AV色综合久久天堂| 久久久久久久精品妇女99| 久久精品无码免费不卡| 97精品国产97久久久久久免费| 区久久AAA片69亚洲| 欧美亚洲另类久久综合婷婷| 久久er国产精品免费观看2| 亚洲欧洲日产国码无码久久99| 无码8090精品久久一区| 久久久久亚洲av成人无码电影| 91精品国产91久久久久久| 精品久久8x国产免费观看| 久久精品国产亚洲精品2020| 久久久久久国产精品无码下载 | 久久久精品久久久久特色影视| 精品熟女少妇a∨免费久久| 亚洲精品乱码久久久久久蜜桃图片| 欧美亚洲国产精品久久| 久久国产精品无|