免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
使用 Boost 的Locale 進(jìn)行字碼轉(zhuǎn)換

原帖: http://viml.nchc.org.tw/blog/paper_info.php?CLASS_ID=1&SUB_ID=1&PAPER_ID=316


這一篇會(huì)比較簡(jiǎn)短一點(diǎn),來大概提一下怎麼用 Boost C++ Libraries 的 Locale(官方文件)這個(gè)函式庫,來進(jìn)行字碼的轉(zhuǎn)換。Locale 這個(gè)函式庫主要是提供 C++ 地區(qū)化(localization)的功能、並提供一些 Unicode 的處理能力;而 Heresy 在這邊只會(huì)針對(duì)字碼轉(zhuǎn)換的部分做說明。


不過在使用時(shí)要注意的一點(diǎn)是,Locale 這個(gè)函式庫是在 1.48.0 才加入的,算是相當(dāng)新的一個(gè)函示庫,所以要使用前必須要先確定自己使用的 Boost 的版本,確認(rèn)是否在 1.48.0 以上;另外,他也是 Boost 中少數(shù)需要建置(build)的函式庫,並且可以搭配 ICU(官網(wǎng))或 iconv(官網(wǎng))來使用,有需要的話請(qǐng)參考官方的建置說明。(註 1、註 2)


基本上,Locale 所提供的轉(zhuǎn)碼功能相當(dāng)?shù)睾?jiǎn)單,官方文件請(qǐng)參考《Character Set Conversions》。


基本上,Locale 所提供的字碼轉(zhuǎn)換都是函式的形式,而且這些函式都在 boost::locale::conv 這個(gè) namespace 下,如果要使用的,則是要引入 boost/locale/encoding.hpp 這個(gè) header 檔。


而他提供用來轉(zhuǎn)碼的函式,則包括了:





  1. 不同字碼間的轉(zhuǎn)換-between()

    這個(gè)函式是用來將字串在不同的字碼間進(jìn)行轉(zhuǎn)換用的,他的介面是:


    string between( string const &text,                string const &to_encoding,                string const &from_encoding,                method_type how=default_method)

    他基本本上只能針對(duì) string 做處理,不支援 wstring。


    使用上相當(dāng)簡(jiǎn)單,第一個(gè)參數(shù) text 就是要進(jìn)行編碼轉(zhuǎn)換的字串,第二個(gè)參數(shù) to_encoding 則是要轉(zhuǎn)換成什麼編碼,第三個(gè)參數(shù) from_encoding 則是描述 text 是用哪種編碼(註 3)。


    而最後一個(gè)參數(shù) how 則是 Locale 的一個(gè)列舉型別,代表在轉(zhuǎn)換失敗的時(shí)候,要做什麼處理;基本上只有兩個(gè)選項(xiàng),skipstop,預(yù)設(shè)會(huì)是 skip,也就是無視無法轉(zhuǎn)換的字元、其他繼續(xù)處理。


    下面就次一個(gè)簡(jiǎn)單的例子,他會(huì)把 source 這個(gè)字串從 BIG5 轉(zhuǎn)換到 UTF-8:


    string source = "....";string s = boost::locale::conv::between( source, "UTF-8", "BIG5" );

     




  2. 轉(zhuǎn)換到 UTF-to_utf()

    這個(gè)函式是將特定編碼的 string,轉(zhuǎn)換成 UTF 字串用的,它的介面基本上是:


    template<typename CharType>basic_string<CharType> to_utf( string const &text,                               string const &charset,                               method_type how )

    他除了可以輸出 string 之外,也可以支援輸出成 wstring。像下面的例子,就是把 sSource 這個(gè) BIG-5 編碼的字串,依序轉(zhuǎn)換成 wstringstring 的字串。


    string sSource = "...";wstring ws = boost::locale::conv::to_utf<wchar_t>( sSource, "BIG5" );string  ss = boost::locale::conv::to_utf<char>( sSource, "BIG5" );

     




  3. 從 UTF 轉(zhuǎn)成其他編碼-from_utf()

    這個(gè)函式和上面介紹的 to_utf() 相反,他是把 UTF 字串(stringwstring)、轉(zhuǎn)換為特定編碼的字串用的。它的介面是:


    template<typename CharType>string from_utf( basic_string<CharType> const &text,                 string const &charset,                 method_type how )

    他可以轉(zhuǎn)換 stringwstring 的字串,但是輸出一定是 string


    下面的例子,就是把 sSourcewSource 這兩個(gè) UTF 字串,都轉(zhuǎn)換成 BIG-5 的 string 字串。


    string  sSource =  "...";wstring wSource = L"...";string  ss1 = boost::locale::conv::from_utf( wSource, "BIG5" );string  ss2 = boost::locale::conv::from_utf( sSource, "BIG5" );

     




  4. Unicode 之間的轉(zhuǎn)換-utf_to_utf()

    這個(gè)函式的目的,是在 UTF 的 string 字串和 wstring 字串之間做轉(zhuǎn)換;他的介面如下:


    template<typename CharOut,typename CharIn>basic_string<CharOut> utf_to_utf( basic_string<CharIn> const &str,                                  method_type how )

    下面的例子,就是把型別是 stringsSource 轉(zhuǎn)換成 wstring、並把型別是 wstringwSource 轉(zhuǎn)換成 string 了~


    string  sSource =  "...";wstring wSource = L"...";wstring wStr = boost::locale::conv::utf_to_utf<wchar_t>( sSource );string  sStr = boost::locale::conv::utf_to_utf<char>( wSource );






這篇就寫到這裡了。基本上,Locale 所提供的字碼轉(zhuǎn)換的功能,在 Heresy 來看算是相當(dāng)簡(jiǎn)單好用的~至少和直接用 iconv 比起來,真的簡(jiǎn)單不少…對(duì)於有需要在程式中進(jìn)行字碼轉(zhuǎn)換的人來說,Heresy 是覺得可以試試看用 Boost 的 Locale 這個(gè)函式庫來做做看啦~


而實(shí)際上,Locale 還有許多其他的功能,但是因?yàn)?Heresy 還用不太到,所以暫時(shí)就不研究了。

不過另外 Heresy 覺得可能比較實(shí)用的,是他的《Messages Formatting (Translation) 》的部分~或許等有需要的時(shí)候,會(huì)來看看這一塊吧。




附註:





  1. 在 Windows 平臺(tái)上,應(yīng)該是可以不搭配 ICU 和 iconv 來使用的;但是在 POSIX 平臺(tái)上,則似乎一定要有 ICU 或 iconv 其中一個(gè)。




  2. Heresy 有試著想在 Windows 平臺(tái)上整合 ICU,不過感覺好像不是很成功…

    不過一個(gè)經(jīng)驗(yàn)是,似乎不能直接下載 ICU 的 binary 來作為 Boost 建置時(shí)的 ICU 路徑,而是需要下載 source code 來自己建置 ICU 才可以。但是雖然 Heresy 成功地讓 Boost 抓到 ICU 了,但是在試著轉(zhuǎn)碼的時(shí)候,他似乎還是去用 Windows 內(nèi)建的 codepage、沒去用 ICU 的…




  3. 編碼基本上是直接以字串來做輸入,例如中文就是「BIG5」、Unicode 則是使用「UTF-8」; 另外也可以使用 std::locale參考)來作為指定編碼的參數(shù)。

    至於有支援那些編碼,則是要看是使用哪種字碼轉(zhuǎn)換的模組,例如有使用 iconv 和 ICU 的話,就是看 iconv 和 ICU 有支援什麼了~而在 Windows + MSVC 環(huán)境下,如果都沒用的話,Boost 會(huì)使用 Windows 內(nèi)建的 code page 來做處理,列表可以參考 Boost 目錄下的\libs\locale\src\encoding\wconv_codepage.ipp 這個(gè)檔案裡的 all_windows_encodings 這個(gè)陣列。




  4. 上述 Locale 所提供的轉(zhuǎn)換函式,都可以改用 char*wchar_t* 作為輸入的字串。




  5. FreeType 的 ft_encoding_unicode 可以使用 wsting 的 UTF 字串。




  6. 要在 standrad IO 輸出 wstring 這轉(zhuǎn)寬字元字串,不能使用 cout,而是要使用 wcout;而如果要輸出中文字串的話,則是需要透過 ostreamimbue() 這個(gè)函式,來做區(qū)域的設(shè)定。下面是一個(gè)例子:


    wstring wSource = L"中文";wcout.imbue( std::locale( "cht" ) );wcout << wSource << endl;

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
S7-1200 1500 指令說明示例HTA: 將十六進(jìn)制數(shù)轉(zhuǎn)換為 ASCII 字符串
boost庫對(duì)unicode字符串的支持問題
wchar_t與char轉(zhuǎn)換(總結(jié))(轉(zhuǎn))
編碼轉(zhuǎn)換的方法(UNICODE/ASCII/UTF
Writing UTF-8 files in C++
從寬字符轉(zhuǎn)換到UTF8的代碼
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服