青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 96  文章 - 255  trackbacks - 0
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

E-mail:zbln426@163.com QQ:85132383 長期尋找對(duì)戰(zhàn)略游戲感興趣的合作伙伴。

常用鏈接

留言簿(21)

隨筆分類

隨筆檔案

SDL相關(guān)網(wǎng)站

我的個(gè)人網(wǎng)頁

我的小游戲

資源下載

搜索

  •  

積分與排名

  • 積分 - 495654
  • 排名 - 39

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

<本文PDF文檔下載>

std::locale

通過前面兩節(jié)的知識(shí),我們知道了在C/C++中,字符(串)和寬字符(串)之間的轉(zhuǎn)換不是簡單的,固定的數(shù)學(xué)關(guān)系,寬窄轉(zhuǎn)換依賴于本地化策略集(locale)。換句話說,一個(gè)程序在運(yùn)行之前并不知道系統(tǒng)的本地化策略集是什么,程序只有在運(yùn)行之后才通過locale獲得當(dāng)時(shí)的本地化策略集。
C有自己的locale函數(shù),我們這里直接介紹C++的locale類。
先討論locale的構(gòu)造函數(shù):
locale() throw();
這個(gè)構(gòu)造函數(shù)是獲得當(dāng)前程序的locale,用法如下:
std::locale app_loc = std::locale();
或者(這是構(gòu)造對(duì)象的兩種表示方式,后同)
std::locale app_loc;
另外一個(gè)構(gòu)造函數(shù)是:
explicit locale(const char* name);
這個(gè)構(gòu)造函數(shù)以name的名字創(chuàng)建新的locale。重要的locale對(duì)象有:
std::locale sys_loc("");      //獲得當(dāng)前系統(tǒng)環(huán)境的locale
std::locale C_loc("C");      或者      std::locale C_loc = std::locale::classic();      //獲得C定義locale
std::locale old_loc = std::locale::global(new_loc);      //將new_loc設(shè)置為當(dāng)前全局locale,并將原來的locale返回給old_loc
除了這些,其它的name具體名字依賴于C++編譯器和操作系統(tǒng),比如Linux下gcc中文系統(tǒng)的locale名字為"zh_CN.UTF-8",中文Windows可以用"chs"(更加完整的名字可以用name()函數(shù)查看)。

mbstowcs()和wcstombs()

這兩個(gè)C運(yùn)行時(shí)庫函數(shù)依賴于全局locale進(jìn)行轉(zhuǎn)換,所以,使用前必須先設(shè)置全局locale。
std::locale已經(jīng)包含在<iostream>中了,再加上我們需要用到的C++字符串,所以包含<string>。
我們先看窄到寬的轉(zhuǎn)換函數(shù):
const std::wstring s2ws(const std::string& s)
{
    std::locale old_loc 
=
        std::locale::global(std::locale(
""));

    
const char* src_str = s.c_str();
    
const size_t buffer_size = s.size() + 1;
    wchar_t
* dst_wstr = new wchar_t[buffer_size];
    wmemset(dst_wstr, 
0, buffer_size);
    mbstowcs(dst_wstr, src_str, buffer_size);
    std::wstring result 
= dst_wstr;
    delete []dst_wstr;

    std::locale::global(old_loc);

    
return result;
}
我們將全局locale設(shè)置為系統(tǒng)locale,并保存原來的全局locale在old_loc中。
在制定轉(zhuǎn)換空間緩存大小的時(shí)候,考慮如下:char是用1個(gè)或多個(gè)對(duì)象,也就是1個(gè)或者多個(gè)字節(jié)來表示各種符號(hào):比如,GB2312用1個(gè)字節(jié)表示數(shù)字和字母,2個(gè)字節(jié)表示漢字;UTF-8用一個(gè)字節(jié)表示數(shù)字和字母,3個(gè)字節(jié)表示漢字,4個(gè)字節(jié)表示一些很少用到的符號(hào),比如音樂中G大調(diào)符號(hào)等。wchar_t是用1個(gè)對(duì)象(2字節(jié)或者4字節(jié))來表示各種符號(hào)。因此,表示同樣的字符串,寬字符串的大小(也就是wchar_t對(duì)象的數(shù)量)總是小于或者等于窄字符串大小(char對(duì)象數(shù)量)的。+1是為了在最后預(yù)留一個(gè)值為0的對(duì)象,以便讓C風(fēng)格的char或者wchar_t字符串自動(dòng)截?cái)唷@當(dāng)然是寬串大小等于窄串大小的時(shí)候才會(huì)用上的,大部分時(shí)候,字符串早在前面某個(gè)轉(zhuǎn)換完畢的位置就被0值對(duì)象所截?cái)嗔恕?br>最后我們將全局locale設(shè)置回原來的old_loc。
窄串到寬串的轉(zhuǎn)換函數(shù):
const std::string ws2s(const std::wstring& ws)
{
    std::locale old_loc 
=
        std::locale::global(std::locale(
""));

    
const wchar_t* src_wstr = ws.c_str();
    size_t buffer_size 
= ws.size() * 4 + 1;
    
char* dst_str = new char[buffer_size];
    memset(dst_str, 
0, buffer_size);
    wcstombs(dst_str ,src_wstr, buffer_size);
    std::
string result = dst_str;
    delete []dst_str;

    std::locale::global(old_loc);

    
return result;
}
這里考慮轉(zhuǎn)換空間緩存大小的策略正好相反,在最極端的情況下,所有的wchar_t都需要4個(gè)char來表示,所以最大的可能就是4倍加1。
這兩個(gè)函數(shù)在VC和gcc中都能正常運(yùn)行(MinGW因?yàn)榍懊嬲f到的原因不支持寬字符的正常使用),在VC中會(huì)給出不安全的警告,這是告訴給那些弄不清寬窄轉(zhuǎn)換實(shí)質(zhì)的人的警告,對(duì)于了解到目前這些知識(shí)的你我來說,這就是啰嗦了。

FeedBack:
# re: 徹底解密C++寬字符:3、利用C運(yùn)行時(shí)庫函數(shù)轉(zhuǎn)換 2010-06-26 20:38 Sunshine Alike
這個(gè)好,我先學(xué)習(xí)了~  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              国产伦精品一区二区三区免费 | 亚洲精品社区| 免费欧美高清视频| 欧美一区二区三区在线| 国产片一区二区| 久久人人九九| 卡一卡二国产精品| 亚洲人成久久| av成人天堂| 国产日产欧美一区| 久久久久综合网| 美女诱惑一区| 亚洲素人一区二区| 性欧美长视频| 亚洲第一毛片| 亚洲精品在线视频| 国产精品日本精品| 久久综合中文| 欧美日韩国产一区二区三区地区 | 欧美日韩一区自拍| 亚洲一级黄色片| 欧美一区午夜精品| 亚洲国产欧美一区二区三区久久| 日韩系列欧美系列| 国产私拍一区| 亚洲精品久久视频| 国产精品腿扒开做爽爽爽挤奶网站| 久久综合久久综合久久| 欧美精品久久久久久久免费观看 | 国产精品嫩草99av在线| 久久成人免费网| 欧美大片在线观看| 久久成人人人人精品欧| 欧美激情成人在线| 久久精品一区二区三区中文字幕| 欧美国产亚洲视频| 久久久99爱| 国产精品成人在线| 亚洲高清资源综合久久精品| 国产日韩亚洲欧美综合| 亚洲精品社区| 1024亚洲| 亚洲女女做受ⅹxx高潮| 亚洲精品小视频| 久久婷婷综合激情| 欧美亚洲免费电影| 亚洲一区欧美一区| 免费在线欧美黄色| 欧美大色视频| 国产精品日韩一区| 日韩视频免费在线观看| 亚洲高清网站| 亚洲在线视频免费观看| 一本久久综合| 亚洲欧美在线一区| 久久综合一区二区三区| 99精品视频免费观看| 国产精品日本精品| 久久久九九九九| 一本久久精品一区二区| 久久久亚洲欧洲日产国码αv| 亚洲国产精品悠悠久久琪琪| 欧美三级小说| 久久免费午夜影院| 亚洲午夜精品视频| 欧美丰满少妇xxxbbb| 亚洲欧美另类中文字幕| 亚洲黄色片网站| 国产精品免费久久久久久| 久久综合给合| 亚洲永久在线| 亚洲精品免费看| 久久精品一区二区三区中文字幕| 99在线精品视频| 在线精品亚洲| 国产精品美女久久久久久久| 免费成人黄色| 久久精品国产亚洲a| 一区二区日韩免费看| 欧美国产日韩亚洲一区| 久久久久久久成人| 亚洲一区二区精品视频| 亚洲国产高清aⅴ视频| 国产欧美日韩免费看aⅴ视频| 欧美激情综合色| 久久综合伊人77777麻豆| 性久久久久久久| 亚洲午夜伦理| aa日韩免费精品视频一| 亚洲国产91| 欧美成人综合一区| 老鸭窝91久久精品色噜噜导演| 欧美一区二区三区视频在线| 亚洲一区二区在线免费观看| 亚洲精品一品区二品区三品区| 在线观看精品一区| 韩国三级电影一区二区| 国产日韩欧美成人| 国产精品亚洲综合| 国产精品成人一区| 欧美日韩免费观看一区二区三区 | av成人毛片| 亚洲人成7777| 亚洲黄色高清| 亚洲国产日韩在线| 欧美顶级艳妇交换群宴| 欧美成人免费全部| 欧美韩日一区二区| 欧美激情一区二区三区高清视频 | 久久免费视频网| 欧美在线视频免费观看| 欧美综合二区| 久久成人免费| 久久婷婷人人澡人人喊人人爽| 久久久精品国产99久久精品芒果| 久久成人免费| 麻豆成人在线| 欧美精品在线看| 欧美日韩亚洲高清| 国产精品日韩专区| 国产亚洲视频在线| 尤物yw午夜国产精品视频明星| 亚洲电影免费观看高清完整版在线观看| 怡红院精品视频| 亚洲人精品午夜| 亚洲社区在线观看| 欧美一区二区性| 老牛嫩草一区二区三区日本| 欧美成人综合在线| 亚洲美女免费精品视频在线观看| 正在播放亚洲一区| 欧美专区日韩专区| 免费成人激情视频| 欧美视频在线观看免费| 国产一区二区高清不卡| 最新国产精品拍自在线播放| 一本色道久久加勒比精品 | 99国产精品国产精品久久 | 99国产精品99久久久久久粉嫩| 日韩亚洲欧美成人一区| 午夜精品国产更新| 男人的天堂亚洲在线| 99re6这里只有精品视频在线观看| 亚洲一区三区在线观看| 久久只精品国产| 欧美日韩免费一区| 好看的亚洲午夜视频在线| 日韩亚洲在线| 久久亚洲午夜电影| 亚洲免费av观看| 久久久久久久久一区二区| 欧美日韩一区在线观看视频| 尤物yw午夜国产精品视频| 亚洲视频你懂的| 欧美 日韩 国产一区二区在线视频 | 欧美一区深夜视频| 欧美伦理91| 狠狠色狠狠色综合人人| 亚洲一区二区三区影院| 农夫在线精品视频免费观看| 中文欧美在线视频| 欧美成人福利视频| 国一区二区在线观看| 亚洲一区欧美二区| 亚洲第一综合天堂另类专| 性娇小13――14欧美| 欧美视频观看一区| 亚洲国产精品免费| 久久精品女人天堂| 中文一区在线| 欧美精品一区视频| 亚洲二区在线观看| 久久久精品动漫| 亚洲一区二区在线视频| 欧美日韩精品一区二区三区四区| 精品福利电影| 久久久久国色av免费观看性色| 宅男噜噜噜66一区二区| 欧美激情bt| 亚洲精品一区二| 亚洲第一页中文字幕| 久久九九免费| 精久久久久久| 美女视频一区免费观看| 欧美一区二区视频在线观看2020| 欧美午夜www高清视频| 亚洲视频一区在线观看| 亚洲精品免费在线| 欧美日韩国产一区精品一区| 99热精品在线观看| 亚洲国产精品热久久| 欧美波霸影院| 亚洲欧洲在线看| 亚洲国产欧美一区二区三区同亚洲| 久久综合网hezyo| 最新国产の精品合集bt伙计| 亚洲第一网站| 欧美久色视频| 中文在线一区| 亚洲网在线观看|