ANSI 編碼
數組
ANSI是一種字符代碼,爲使計算機支持更多語 言,一般使用0x80~0xFF 範圍的2 個字節來表示1 個字符。不一樣的國家和地區制定了不一樣的標準,由此產生了GB23十二、GBK、GB18030、Big五、Shift_JIS 等各自的編碼標準。 這些使用多個字節來表明一個字符的各類漢字延伸編碼方式,稱爲ANSI 編碼。瀏覽器
關於MBCS字符集(Multi Byte Character System):GB23十二、GBK等編碼被稱爲MBCS,MBCS同ASCII是徹底兼容的。對於前ASCII的128個字符,在MBCS字符集下有徹底相同的編碼,而漢字等字符用多個字節存儲。也意味着MBCS下,字符的長度有可能有1個字節的,也有多個字節的。ide
因此ANSI編碼實際上是一個統稱,不一樣的語言使用不一樣的編碼規範,並無跨語言統一編碼。好比 windows7 notepad記事本保存的時候,在彈出對話框的下方有「編碼」下拉框,默認是「ANSI」,也能夠選擇「Unicode」(實際上是UTF-16)和 「UTF-8」。若是選擇了ANSI,那麼實際使用的編碼規範就跟你的操做系統版本強相關了,若是是簡體中文的windows就會用GBK標準。函數
Unicode編碼學習
就是把地球上全部的語言的符號,都用統一的字符集來表示,一個編碼真正作到了惟一。Unicode只是肯定了字符的二進制編碼,但並無肯定字符存儲的具體實現方式。好比UTF-8 ,UTF16是常見的Unicode實現方式。編碼
UTF-8編碼是變長的,一個字符多是1個字節,2個字節,3個字節或者4個字節長。通常來講,歐洲的字母字符長度爲1到2個字節,而亞洲的大部分字符則是3個字節,附加字符爲4個字節長。Unix平臺中廣泛支持UTF-8字符集,HTML和大多數瀏覽器也支持UTF-8。
UTF-16編碼的字符,要麼是2個字節,要麼是4個字節表示的。windows2000以上版本使用UTF-16,老版本windows用的ANSI。
VC下的格式轉換
ANSI字符串轉Unicode(windows下對應UTF-16編碼)
在vc工程選擇unicode編譯的狀況下,若是是字符串常量能夠直接使用L和_T or _TEXT宏,也可使用wsprintf函數進行轉換(須要引用Windows.h)。
TCHAR szW[
100];
//
all strings are Unicode
swprintf(szW,L
"
%s
",L
"
Unicode Str中文
");
CString name = _T(
"
Report.txt
");
//
ANSI to Unicode,wsprintf能夠直接用,使用大寫的%S
//
注意swprintf函數是不行的,聽說要先加setlocale(LC_CTYPE, "chs")語句
wsprintfW(szW,L
"
%S
",
"
Unicode Str中文
");
若是是字符串變量,使用ATL 提供的字符轉換宏會比較方便,也可使用wsprintf函數。
char buff[
512];
//
獲取工做目錄的路徑,ANSI編碼,路徑中的中文字符佔用2個字節
std::
string s_currPath = _getcwd(buff,
512);
TCHAR szW[
512];
USES_CONVERSION;
//
注意使用A2W宏,不可直接調用swprintf_s(szW,512,L"%S",...)
swprintf_s(szW,
512,L
"
%s
",A2W(s_currPath.c_str()));
//
wsprintf能夠直接使用
wsprintfW(szW,L
"
%S
",s_currPath.c_str());
Unicode轉ANSI
和上面相似,使用ATL的宏W2A便可。或者使用wsprintfA(sA, "%S", L"中文"),其中sA是char數組。
另外,轉換還可使用功能更強大的WideCharToMultiByte函數和MultiByteToWideChar函數。
C++11與Unicode
C++11對Unicode提供了語言級別和庫級別的支持,能夠進行Unicode下不一樣編碼方式的轉換,我也沒玩過,能夠參考這篇blog: