• <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 小明 閱讀(5844) 評論(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热精品| 亚洲国产精品高清久久久| 97久久国产亚洲精品超碰热| 俺来也俺去啦久久综合网| 久久国产乱子精品免费女| 精品乱码久久久久久夜夜嗨| 久久精品国产一区二区电影| 亚洲一级Av无码毛片久久精品| 久久久久久精品免费免费自慰| 国产精品久久国产精麻豆99网站 | 久久亚洲精精品中文字幕| 狠狠色婷婷综合天天久久丁香| 日本精品久久久久影院日本| 精品熟女少妇a∨免费久久| 日韩中文久久| 欧美777精品久久久久网| 一本一本久久aa综合精品 | 久久青青色综合| 日韩精品国产自在久久现线拍| 国产精品久久久久免费a∨| 久久综合九色综合97_久久久| 久久精品国产久精国产果冻传媒| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 亚洲AV无码久久精品成人 | 亚洲欧美日韩中文久久| 国产毛片久久久久久国产毛片| 久久国产精品成人影院| 久久久国产打桩机| 午夜精品久久久久久影视riav| 国产亚洲精午夜久久久久久| 久久99精品久久久久久久久久 | 久久久久综合网久久| 久久久久久精品无码人妻| 伊人久久成人成综合网222| 久久99精品九九九久久婷婷| 久久精品国产亚洲一区二区| 99久久精品国产免看国产一区| 69久久精品无码一区二区| 国产∨亚洲V天堂无码久久久| 欧美黑人又粗又大久久久| 中文字幕乱码久久午夜|