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

            小明思考

            高性能服務器端計算
            posts - 70, comments - 428, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            C++源文件編碼問題

            Posted on 2007-04-05 15:30 小明 閱讀(5851) 評論(6)  編輯 收藏 引用 所屬分類: C/C++ToolsG11N/ICU
            1 . VC8(VS2005)

               VC8能識別的源文件編碼有三種:ANSI(本地codepage),utf8,utf16. 后面兩種要保留BOM,否則VC8不能識別。

               基本上源文件的編碼其實只對文件中的字符串的值有影響。

            先說結論:
            對于普通字符串("中文1234"),VC8會把它從源文件的編碼格式轉為ANSI字符串。
            對于寬字符串(L"中文1234"), VC8會把它從源文件的編碼格式轉為utf16字符串。

            例子1:test.cpp (編碼是utf8)
            #include <stdio.h>
            #include 
            <string.h>

            #define TEST_MSG            "中文1234"

            int main(int argc, char* argv[])
            {
                
            char buf[1024]={0};
                strcpy(buf,TEST_MSG);
                
            printf("%s\n",buf);

                
            for(int i=0;buf[i]!=0;++i)
                {
                    printf(
            "0x%2x ",(unsigned char)buf[i]);
                }
                
            return 0;
            }

            如果這個程序在codepage 936(簡體中文)上面去compile
            輸出的結果就是
            中文1234
            0xd6 0xd0 0xce 0xc4 0x31 0x32 0x33 0x34
            可以看出是gb2312的編碼,而不是utf8

            如果這個程序在codepage 932(日文)上面去compile
            輸出的結果就是
            中文1234
            0x92 0x86 0x95 0xb6 0x31 0x32 0x33 0x34
            可以看出是shift-jis的編碼,也不是utf8
            (注:shift-jis也包含"中文"兩個字)

            也就是說同樣的source code在不同的code page下產生不同的可執行文件

            例子2:test.cpp (編碼改為ANSI)
            如果這個程序在codepage 936(簡體中文)上面去compile
            輸出的結果就是
            中文1234
            0xd6 0xd0 0xce 0xc4 0x31 0x32 0x33 0x34
            可以看出是gb2312的編碼,而不是utf8

            把相同的file拷貝到codepage 932(日文)上面去compile
            輸出的結果是
            ????1234
            0xd6 0xd0 0xce 0xc4 0x31 0x32 0x33 0x34
            可以看出是binary內容相同,但是string卻不同了

            例子三:test.cpp (編碼utf8)

            #include <stdio.h>
            #include 
            <string.h>

            #define TEST_MSG            L"中文1234"

            int main(int argc, char* argv[])
            {
                
            char buf[1024]={0};
                memcpy(buf,(
            const char *)TEST_MSG,sizeof(TEST_MSG));
                
            //printf("%s\n",buf);

                
            for(int i=0;i<sizeof(TEST_MSG);++i)
                {
                    printf(
            "0x%x ",(unsigned char)buf[i]);
                }
                
            return 0;
            }

            在任何平臺下使用vc8去compile,結果都應該是輸出
            0x2d 0x4e 0x87 0x65 0x31 0x0 0x32 0x0 0x33 0x0 0x34 0x0 0x0 0x0

            順便考你一下:
            如果想輸出"中文1234"的utf8格式,應該如何寫代碼,保證vc8在任何語言平臺下面去compile,結果都一樣正確?


            2. gcc/g++
            gcc/g++似乎不支持utf16編碼的源文件
            可以處理ANSI和utf8格式的源文件(no BOM)

            如果采用例子一所用的源文件(utf8編碼)
            會輸出
            0xe4 0xb8 0xad 0xe6 0x96 0x87 0x31 0x32 0x33 0x34
            可以看出是utf8是編碼

            這一點上看vc8和gcc是不同的

            如果采用例子三所用的源文件(編碼是utf8,使用L和wchar_t)
            會輸出
            0x2d 0x4e 0x0 0x0 0x87 0x65 0x0 0x0 0x31 0x0 0x0 0x0 0x32 0x0 0x0 0x0 0x33 0x0 0x0 0x0 0x34 0x0 0x0 0x0 0x0 0x0 0x0 0x0
            可以看出gcc的wchar_t是四個字節,跟vc8也不同


            有些復雜,希望不要讓你困擾。

            Feedback

            # re: C++源文件編碼問題  回復  更多評論   

            2007-04-05 19:36 by Corner Zhang
            建議把源代碼的文件的編碼設為UTF8

            # re: C++源文件編碼問題  回復  更多評論   

            2007-04-05 22:03 by 自大者
            我看樓主自己也沒搞清什么是"字符集"和"字符集編碼", 根本就不是什么utf16, 而是utf16-be, 就是ucs2, 就是你所謂的unicode.

            # re: C++源文件編碼問題  回復  更多評論   

            2007-04-05 23:31 by 阿來
            長見識了 :)

            # re: C++源文件編碼問題  回復  更多評論   

            2007-09-26 09:11 by Minidx全文檢索
            “任何平臺下使用vc8去compile,結果都應該是……“
            VC8還支持什么平臺??

            # re: C++源文件編碼問題  回復  更多評論   

            2008-03-07 00:27 by 逍遙劍客
            頭疼, 以后全UTF吧

            # re: C++源文件編碼問題  回復  更多評論   

            2011-12-09 10:11 by NetAsker
            建議初學者別看這個。會被誤導的。
            這個例子只會讓初學者更糊涂。
            不知道是作者不理解unicode,還是故意攪混水。。
            1。 首先,第一個例子,“如果這個程序在codepage 932(日文)上面去compile” 那么,你是拷貝過去的還是在日本系統上自己編輯的?從結果來看,我覺得你是拷貝過去的。

            2。在看你的例3 test 中為什么沒有字符串打印? 你注視掉 //printf("%s\n",buf);這么關鍵的一句,為什么呢??你可以用wcsprintf測試。

            3。還是測試3, “在任何平臺下使用vc8去compile,結果都應該是輸出
            0x2d 0x4e 0x87 0x65 0x31 0x0 0x32 0x0 0x33 0x0 0x34 0x0 0x0 0x0”

            你知道這是什么編碼格式嗎?utf-8還是utf16?,你說任何平臺下使用vc8,你說的任何平臺什么意思?




            中文字幕一区二区三区久久网站| 久久久艹| 久久99热精品| 久久人人爽人人澡人人高潮AV | 狠狠色丁香久久婷婷综| 97精品伊人久久久大香线蕉 | 97久久精品人人澡人人爽| 欧美色综合久久久久久| 中文国产成人精品久久不卡| 久久se精品一区二区| 久久精品国产亚洲αv忘忧草| 久久国产精品-久久精品| 国产精品久久久久久五月尺| 亚洲国产精品久久久久| 久久综合国产乱子伦精品免费| 国产免费久久精品丫丫| 久久精品国产精品亚洲毛片| 亚洲伊人久久成综合人影院| 国产L精品国产亚洲区久久| 亚洲AV日韩精品久久久久久| 青青草国产97免久久费观看| 国产一级持黄大片99久久| 少妇人妻88久久中文字幕| 午夜福利91久久福利| 久久精品国产国产精品四凭| …久久精品99久久香蕉国产 | 久久精品国产亚洲av日韩| 久久久久se色偷偷亚洲精品av| 久久久国产精华液| 久久久久亚洲av成人无码电影| 国産精品久久久久久久| 久久久青草青青亚洲国产免观| 久久精品国产99国产精偷| 久久国产精品久久| 国产精品美女久久久久AV福利| 91精品免费久久久久久久久| 成人国内精品久久久久影院| 99久久久精品免费观看国产| 精品一区二区久久| 国产69精品久久久久99尤物| 欧美日韩精品久久久久|