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

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

Ansi、Unicode、UTF8字符串之間的轉換和寫入文本文件

轉載請注明出處http://m.shnenglu.com/greatws/archive/2008/08/31/60546.html

最近有人問我關于這個的問題,就此寫一篇blog

Ansi字符串我們最熟悉,英文占一個字節,漢字2個字節,以一個\0結尾,常用于txt文本文件
Unicode字符串,每個字符(漢字、英文字母)都占2個字節,以2個連續的\0結尾,NT操作系統內核用的是這種字符串,常被定義為typedef unsigned short wchar_t;所以我們有時常會見到什么char*無法轉換為unsigned short*之類的錯誤,其實就是unicode
UTF8是Unicode一種壓縮形式,英文A在unicode中表示為0x0041,老外覺得這種存儲方式太浪費,因為浪費了50%的空間,于是就把英文壓縮成1個字節,成了utf8編碼,但是漢字在utf8中占3個字節,顯然用做中文不如ansi合算,這就是中國的網頁用作ansi編碼而老外的網頁常用utf8的原因。
UTF8在還游戲里運用的很廣泛,比如WOW的lua腳本等

下面來說一下轉換,主要用代碼來說明吧
寫文件我用了CFile類,其實用FILE*之類的也是一樣,寫文件和字符串什么類別沒有關系,硬件只關心數據和長度

Ansi轉Unicode
介紹2種方法


void CConvertDlg::OnBnClickedButtonAnsiToUnicode()
{
   
// ansi to unicode
    char* szAnsi = "abcd1234你我他";
   
//預轉換,得到所需空間的大小
    int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
   
//分配空間要給'\0'留個空間,MultiByteToWideChar不會給'\0'空間
    wchar_t* wszString = new wchar_t[wcsLen + 1];
   
//轉換
    ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
   
//最后加上'\0'
    wszString[wcsLen] = '\0';
   
//unicode版的MessageBox API
    ::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);

   
//接下來寫入文本
   
//寫文本文件,頭2個字節0xfeff,低位0xff寫在前
    CFile cFile;
    cFile.Open(_T(
"1.txt"), CFile::modeWrite | CFile::modeCreate);
   
//文件開頭
    cFile.SeekToBegin();
    cFile.Write(
"\xff\xfe", 2);
   
//寫入內容
    cFile.Write(wszString, wcsLen * sizeof(wchar_t));
    cFile.Flush();
    cFile.Close();
    delete[] wszString;
    wszString
=NULL;


   
//方法2
   
//設置當前地域信息,不設置的話,使用這種方法,中文不會正確顯示
   
//需要#include<locale.h>
    setlocale(LC_CTYPE, "chs");
    wchar_t wcsStr[
100];
   
//注意下面是大寫S,在unicode中,代表后面是ansi字符串
   
//swprintf是sprintf的unicode版本
   
//格式的前面要加大寫L,代表是unicode
    swprintf(wcsStr, L"%S", szAnsi);
    ::MessageBoxW(GetSafeHwnd(), wcsStr, wcsStr, MB_OK);

}


Unicode轉Ansi
也是2種方法

void CConvertDlg::OnBnClickedButtonUnicodeToAnsi()
{
   
// unicode to ansi
    wchar_t* wszString = L"abcd1234你我他";
   
//預轉換,得到所需空間的大小,這次用的函數和上面名字相反
    int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
   
//同上,分配空間要給'\0'留個空間
    char* szAnsi = new char[ansiLen + 1];
   
//轉換
   
//unicode版對應的strlen是wcslen
    ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL);
   
//最后加上'\0'
    szAnsi[ansiLen] = '\0';
   
//Ansi版的MessageBox API
    ::MessageBoxA(GetSafeHwnd(), szAnsi, szAnsi, MB_OK);

   
//接下來寫入文本
   
//寫文本文件,ANSI文件沒有BOM
    CFile cFile;
    cFile.Open(_T(
"1.txt"), CFile::modeWrite | CFile::modeCreate);
   
//文件開頭
    cFile.SeekToBegin();
   
//寫入內容
    cFile.Write(szAnsi, ansiLen * sizeof(char));
    cFile.Flush();
    cFile.Close();
    delete[] szAnsi;
    szAnsi
=NULL;


   
//方法2
   
//和上面一樣有另一種方法
    setlocale(LC_CTYPE, "chs");
   
char szStr[100];
   
//注意下面是大寫,在ansi中,代表后面是unicode字符串
   
//sprintf
    sprintf(szStr, "%S", wszString);
    ::MessageBoxA(GetSafeHwnd(), szStr, szStr, MB_OK);
}


Unicode轉UTF8

void CConvertDlg::OnBnClickedButtonUnicodeToU8()
{
   
// unicode to UTF8
    wchar_t* wszString = L"abcd1234你我他";
   
//預轉換,得到所需空間的大小,這次用的函數和上面名字相反
    int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
   
//同上,分配空間要給'\0'留個空間
   
//UTF8雖然是Unicode的壓縮形式,但也是多字節字符串,所以可以以char的形式保存
    char* szU8 = new char[u8Len + 1];
   
//轉換
   
//unicode版對應的strlen是wcslen
    ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), szU8, u8Len, NULL, NULL);
   
//最后加上'\0'
    szU8[u8Len] = '\0';
   
//MessageBox不支持UTF8,所以只能寫文件

   
//接下來寫入文本
   
//寫文本文件,UTF8的BOM是0xbfbbef
    CFile cFile;
    cFile.Open(_T(
"1.txt"), CFile::modeWrite | CFile::modeCreate);
   
//文件開頭
    cFile.SeekToBegin();
   
//寫BOM,同樣低位寫在前
    cFile.Write("\xef\xbb\xbf", 3);
   
//寫入內容
    cFile.Write(szU8, u8Len * sizeof(char));
    cFile.Flush();
    cFile.Close();
    delete[] szU8;
    szU8
=NULL;

}

UTF8轉UNICODE

void CConvertDlg::OnBnClickedButtonU8ToUnicode()
{
   
//UTF8 to Unicode
   
//由于中文直接復制過來會成亂碼,編譯器有時會報錯,故采用16進制形式
    char* szU8 = "abcd1234\xe4\xbd\xa0\xe6\x88\x91\xe4\xbb\x96\x00";
   
//預轉換,得到所需空間的大小
    int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
   
//分配空間要給'\0'留個空間,MultiByteToWideChar不會給'\0'空間
    wchar_t* wszString = new wchar_t[wcsLen + 1];
   
//轉換
    ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);
   
//最后加上'\0'
    wszString[wcsLen] = '\0';
   
//unicode版的MessageBox API
    ::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);

   
//寫文本同ansi to unicode
}



Ansi轉換utf8和utf8轉換Ansi就是上面2個的結合,把unicode作為中間量,進行2次轉換即可

by greatws

posted on 2008-09-01 11:38 肥仔 閱讀(795) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区影音先锋| 久久精品亚洲乱码伦伦中文 | 国产女人水真多18毛片18精品视频| 黄色国产精品| 欧美专区18| 亚洲一区二区免费在线| 欧美午夜在线视频| 亚洲一二三四区| 日韩视频在线永久播放| 欧美精品免费视频| 日韩网站在线| 亚洲精品一级| 欧美日韩精品二区第二页| 日韩亚洲欧美中文三级| 亚洲第一网站免费视频| 久久一区二区三区四区五区| 狠狠色狠狠色综合日日五 | 久久久蜜臀国产一区二区| 国产精品综合| 久久er99精品| 欧美一区二区视频在线观看| 国产手机视频精品| 久久五月天婷婷| 久久亚洲影院| 日韩系列欧美系列| 99热这里只有成人精品国产| 欧美日韩日本网| 午夜免费久久久久| 欧美亚洲在线观看| 精品av久久久久电影| 男人天堂欧美日韩| 欧美精品成人| 亚洲欧美在线高清| 久久aⅴ国产紧身牛仔裤| 在线观看日韩www视频免费| 亚洲国产老妈| 国产精品日本精品| 蜜臀久久久99精品久久久久久| 久久婷婷丁香| 亚洲图片在线| 久久福利毛片| 一区二区三区日韩精品| 亚洲欧美成人综合| 亚洲欧洲美洲综合色网| 亚洲素人在线| 亚洲国产裸拍裸体视频在线观看乱了中文 | 麻豆久久久9性大片| 亚洲精品资源| 午夜激情综合网| 最近看过的日韩成人| 99精品热6080yy久久| 国产一区在线免费观看| 91久久精品一区二区别| 国产一二三精品| 久久久噜噜噜久久狠狠50岁| 久久人人97超碰人人澡爱香蕉| 日韩亚洲欧美精品| 欧美一区二区私人影院日本 | 欧美成人一区二区在线| 欧美日韩在线免费视频| 久热精品视频| 国产精品久久久久秋霞鲁丝| 欧美大片国产精品| 国产免费亚洲高清| 一本色道久久综合亚洲91| 狠狠色综合一区二区| 中日韩午夜理伦电影免费| 亚洲国产专区| 久久久久久国产精品mv| 香蕉久久夜色精品国产使用方法| 欧美成人精品1314www| 久久免费国产精品| 国产精品日韩一区二区三区| 91久久在线视频| 亚洲国产精品99久久久久久久久| 一区二区三区日韩精品视频| 亚洲精品欧美精品| 久久午夜影视| 麻豆久久久9性大片| 国产精品推荐精品| 一区二区欧美在线观看| 99精品热视频只有精品10| 久久在线免费观看| 久久久久一区| 国产一在线精品一区在线观看| 中日韩午夜理伦电影免费| 一区二区三区精品久久久| 欧美成人嫩草网站| 欧美大尺度在线观看| 精品88久久久久88久久久| 欧美一区二区在线看| 久久精品99国产精品日本| 国产欧美视频在线观看| 亚洲欧美成人一区二区在线电影| 亚洲专区欧美专区| 国产精品久久久久毛片软件 | 99视频一区二区| 99精品欧美一区二区三区综合在线| 久久综合中文字幕| 欧美成人黄色小视频| 亚洲国产另类久久精品| 欧美大片在线观看一区| 日韩视频永久免费| 亚洲性色视频| 国产日产精品一区二区三区四区的观看方式 | 一区二区三区视频在线看| 一二三区精品| 欧美亚洲不卡| 欧美一区2区视频在线观看| 久久久综合免费视频| 麻豆精品传媒视频| 欧美激情一区二区三区在线视频观看 | 一本色道**综合亚洲精品蜜桃冫| 欧美大片一区| 一二三区精品| 欧美综合77777色婷婷| 国产一区二区久久久| 久久久欧美一区二区| 亚洲国产精品久久久久久女王| 亚洲理论在线| 国产精品毛片| 久久久久久9| 日韩一二三在线视频播| 久久精品国产99国产精品澳门 | 欧美一区二区三区久久精品| 国产性猛交xxxx免费看久久| 麻豆91精品| 亚洲视频免费在线观看| 久久婷婷av| 一区二区高清在线| 国产亚洲欧美一区二区| 欧美激情一区三区| 欧美一区二区在线视频| 91久久精品一区| 久久久久国内| 亚洲视频在线观看网站| 伊人伊人伊人久久| 国产精品成人播放| 麻豆亚洲精品| 午夜天堂精品久久久久 | 欧美大片免费观看| 午夜精品视频| 日韩午夜精品| 男人插女人欧美| 欧美伊人影院| 在线视频日本亚洲性| 狠狠色综合一区二区| 国产精品久久久久久久久久久久久| 久久久久久97三级| 亚洲欧美日韩国产综合精品二区| 亚洲高清一区二区三区| 久久免费视频在线| 午夜精品亚洲一区二区三区嫩草| 亚洲三级国产| 精品盗摄一区二区三区| 国产精品自拍三区| 欧美午夜理伦三级在线观看| 欧美+日本+国产+在线a∨观看| 午夜欧美精品| 亚洲一区三区视频在线观看| 亚洲精品一区二区在线观看| 美乳少妇欧美精品| 久久天天综合| 久久久青草婷婷精品综合日韩| 亚洲欧美日韩国产成人| 一区二区三区日韩| 一本一本久久| 一区二区三区四区五区精品视频 | 香蕉成人久久| 亚洲自拍偷拍色片视频| 在线一区欧美| 亚洲色图自拍| 国产精品高潮呻吟| 欧美日本精品在线| 欧美福利视频在线| 欧美成人dvd在线视频| 巨胸喷奶水www久久久免费动漫| 久久成人精品无人区| 欧美一区二区精品| 久久狠狠一本精品综合网| 久久精品国亚洲| 久久久久久婷| 狂野欧美一区| 欧美国产日韩一二三区| 欧美精品日韩| 欧美午夜剧场| 国产视频一区二区在线观看| 国产亚洲精品成人av久久ww| 国产在线一区二区三区四区 | 亚洲精品美女在线| 亚洲激情影视| 一本色道久久精品| 亚洲欧美日韩专区| 久久精品噜噜噜成人av农村| 久久蜜臀精品av| 欧美日产国产成人免费图片| 欧美性一二三区| 国产综合久久| 亚洲免费av网站| 午夜精品美女自拍福到在线|