<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 16.3 字符編碼和Unicode 這個世界上有太多太多的字符,遠超過了一個字節(8bit)可能容納的256個數目.為了顯式超過256個字符以外的其它字符,一個新的手段被增加進來,那就是字符編碼和字符集(更新和更好的"Unicode"解決方案,我們也將很快談到.). 因此,到底字節161代表什么字符,是由當前使用的字符集決定的.在ISO 8859-1(Latin-1)字符集中,它代表的是一個倒寫的感嘆號,而在ISO 8859-2字符集中,則代表的是字母a(Aogonek). 當你在一個窗口上繪制字符的時候,系統必須知道你使用的編碼,這成為字體編碼,也就是所謂的字符集.創建一個沒有指定字符集的字體意味著使用默認編碼,這在大多數系統上都是沒有問題的,因為大多數人都在使用支持本國語言的系統. 但是,如果你確定某些字符使用的是不同的編碼(比如ISO 8859-2),在創建字體的時候,你應該指定這種編碼,如下所示: ``` wxFont myFont(10, wxFONTFAMILY_DEFAULT, wxNORMAL, wxNORMAL, false, wxT("Arial"), wxFONTENCODING_ISO8859_2); ``` 否則,在一個西文系統ISO 8859-1中,字符將不能被正確顯式. 有時候可能我們無法找到一個合適的滿足某種編碼的字體,這種情況下,我們可以嘗試使用一種代替字體,不過你需要將要顯式的字體轉換成那種代替字體對應的編碼方式.下面的代碼演示了應該怎樣作.一個字符串text的編碼為enc,準備用字體facename顯示.同時下面的代碼也演示了wxCSConv的用法: ``` // 我們有一段'enc'編碼的文本,我們希望用字體 // 'facename'顯示. // // 首先,我們必須確定這個字體可以顯示這種編碼 wxString text; // 編碼方式為 'enc' if (!wxFontMapper::Get()->IsEncodingAvailable(enc, facename)) { // 不能支持這種編碼,需要查找替代編碼. // 能支持某種替代編碼嗎? wxFontEncoding alternative; if (wxFontMapper::Get()->GetAltForEncoding(enc, &alternative, facename, false)) { // 我們找到了替代編碼方案'alternative', // 因此我們進行編碼的轉換,轉換成alternative. wxCSConv convFrom(wxFontMapper::GetEncodingName(enc)); wxCSConv convTo(wxFontMapper::GetEncodingName(alternative)); text = wxString(text.wc_str(convFrom), convTo) ; // 然后創建alternative編碼的字體 wxFont myFont(10, wxFONTFAMILY_DEFAULT, wxNORMAL, wxNORMAL, false, facename , alternative); dc.SetFont(myFont); } else { // 不能找到完美替代編碼;嘗試有損耗的編碼方案 // ISO 8859-1 (7-bit ASCII) wxFont myFont(10, wxFONTFAMILY_DEFAULT, wxNORMAL, wxNORMAL, false, facename, wxFONTENCODING_ISO8859_1); dc.SetFont(myFont); } } else { // OK,這個字體可以支持這個編碼. wxFont myFont(10, wxFONTFAMILY_DEFAULT, wxNORMAL, wxNORMAL, false, facename, enc); dc.SetFont(myFont); } // 最后,我們使用選擇的字體繪制可能已經經過編碼轉換的字符串. dc.DrawText(text, 100, 100); ``` 轉換數據 前面的代碼演示了將一組字節流從一種編碼轉換為另外一種編碼的方法.這種轉換可以有兩種方法,第一種是使用 wxEncodingConverter類,這種方法是不被推薦的(可能在后續版本種被淘汰的方法),你不應該在新的代碼種使用這種方法,除非你的編譯器不支持wchar_t結構. 推薦使用第二種方法,字符集轉換(使用基于wxMBConv的wxCSConv). wxEncodingConverter 這種方法只能支持部分的字符集,但是如果你的編譯器不支持wchar_t結構,這是你唯一的選擇,轉換方法如下: ``` wxEncodingConverter converter(enc, alternative, wxCONVERT_SUBSTITUTE); text = converter.Convert(text); ``` wxCONVERT_SUBSTITUTE標記表明允許轉換過程中如果找不到嚴格對應的字符,允許存在信息損失, 這將導致帶重音符號的字母變成普通的字母或者短破折號和長破折號統一用"-"來代替等. wxCSConv (wxMBConv) Unicode的解決方案的核心是,它使用16bit或者甚至是32bit的wchar_t結構來代表一個字符,因此它可以把全世界所有的字符用一種編碼表示.這意味著你不需要處理任何編碼轉換之類的問題除非你需要處理老的8-bit格式數據,前面我們已經說過,8bit的數據必須和字符集一起使用才有意義. 即使你沒有把wxWidgets編譯成Unicode模式(這種模式下,所有的字符串都是Unicode編碼格式),只要你的系統支持,你還是可以使用它進行編碼轉換.轉換的方法是,先把你的字符串從它的編碼轉換成Unicode編碼,然后再從Unicode編碼轉換成目標編碼. wxString類也使用這種方法來提供編碼轉換支持.要記住的是:非Unicode版本的wxWidgets中的wxString對象采用的是8bit 的方法保存字符串,因此它自己并不知道其內部的數據使用的是什么編碼方式. 如果想把wxString轉換成Unicode,你需要使用wxString::wc_str函數,這個函數采用一個多字節轉換類作為它的參數,這個參數告訴非Unicode版本的wxString它內部的字符串是采用什么編碼方式的,但是在Unicode版本的wxWidgets中, 這個參數被忽略,因為wxString內部的編碼已經是Unicode了. 在Unicode版本中,我們可以直接使用wx_str返回的字符串了,但是在非Unicode版本中,我們還需要將其轉換為我們可以支持的編碼方式convTo,因此在下面的代碼中,在Unicode版本中,convTo也將被忽略: ``` text = wxString(text.wc_str(convFrom), convTo); ``` 可以看到字符集編碼比字體字體編碼更常使用,因此有時候你需要通過下面的代碼將字體編碼名字裝換成字符集編碼名字: ``` wxFontMapper::GetEncodingName(fontencoding); ``` 這就是上面例子中下面這一部分代碼的含義: ``` wxCSConv convFrom(wxFontMapper::GetEncodingName(enc)); wxCSConv convTo(wxFontMapper::GetEncodingName(alternative)); text = wxString(text.wc_str(convFrom) , convTo) ; ``` 有時候你需要直接使用8bit的字節流而不是使用wxString,這可以通過使用wxCharBuffer類獲得,下面我們看看這一行代碼: ``` wxCharBuffer output = convTo.cWC2MB(text.wc_str(convFrom)); ``` 如果你的輸入數據不是一個字符串而也是一個8bit的數據流(比如也是一個wxCharBuffer),你可以使用下面的轉換方式: ``` wxCharBuffer output = convTo.cWC2MB(convFrom.cMB2WC(input)); ``` wxWidgets定義了一些全局的類用于實現字符轉換,比如wxConvISO8859_1是一個對象,而wxConvCurrent 是一個指針,指向當前標準C的locale指定的編碼類.另外還有一些wxMBConv的子類用來優化特定的編碼轉換任務,比如 wxMBConvUTF7,wxMBConvUTF8, wxMBConvUTF16LE/BE和wxMBConvUTF32LE/BE.其中后兩個被重定義為wxMBConvUFT16/32,它使用機器本身的字節序.更多信息請參考wxWidgets手冊中的"wxMBConv Classes Overview"小節. 轉化來自外部的臨時緩存數據 正如我們剛剛討論的那樣,轉換類允許你很方便的把一種字符集轉換為另外一種字符集.然而,大多數的轉換結果為一個新創建的字符串或者一個臨時緩存.有時候我們需要將轉換的結果保存起來已備以后使用,這種情況下我們可以把轉換的結果復制到一個獨立的存儲區. 假設我們想在兩個電腦之間通過socket傳遞字符串.我們首先應該在字符串采用的編碼上取得一致.否則,平臺默認的編碼可能把傳遞的字符串搞的一團糟.在我們的這個例子中,我們把發送出去的字符串先轉換成UTF-8編碼,在接收的部分,在將UTF-8編碼的字符串轉換成系統默認的字符串. 下面的代碼演示了怎樣將符合本地編碼的字符串轉換成UTF-8,將轉換結果存儲在一個char*指針中,然后通過socket發送出去,接收的電腦再將收到的字符串從UTF-8轉換成它自己的電腦上的本地編碼. ``` // 將本地編碼字符串轉換成UTF-8編碼 const wxCharBuffer ConvertToUTF8(wxString anyString) { return wxConvUTF8.cWC2MB( anyString.wc_str(*wxConvCurrent) ) ; } // 將UTF-8編碼的字符串轉換成本地編碼字符串 wxString ConvertFromUTF8(const char* rawUTF8) { return wxString(wxConvUTF8.cMB2WC(rawUTF8), *wxConvCurrent); } // 測試以下這兩個轉換函數 void StringConversionTest(wxString anyString) { // 轉化成UTF-8編碼并保存在wxCharBuffer中. const wxCharBuffer bUTF8 = ConvertToUTF8(anyString); // wxCharBuffer可以隱式的轉換成char*. const char *cUTF8 = bUTF8 ; // 重建字符串 wxString stringCopy = ConvertFromUTF8(cUTF8); // 因為是同一個電腦,這兩個字符串應該是完全相同的. wxASSERT(anyString == stringCopy); } ``` 幫助文件 你需要為每個支持的語言制作一份幫助文件.你的幫助文件控制器在初始化的時候將指定幫助文件的名稱.你可以使用wxLocale::GetName來獲取語言相關的名稱,也可以直接使用前面介紹的_()宏以便獲得語言相關的名稱.比如: ``` m_helpController->Initialize(_("help_english")); ``` 如果你使用的是wxHtmlHelpController,記住你需要給每一個幫助頁面指定META標記,如下所示: ``` <meta http-equiv="Content-Type" content="text/html; charset=iso8859 //2"> ``` 你還需要注意幫助工程文件(擴展名.hhp)也許要包含一個指定編碼的選項行: ``` Charset=iso8859-2 ``` 這個額外的條目告訴HTML幫助控制器幫助內容和幫助索引使用什么編碼格式編碼的.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看