ANSI與Unicode的轉換

最近遇到中文路徑訪問的問題,又從新學習了一遍ansi與Unicode的知識,博文記錄下來以供後續參考。windows

 

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:
相關文章
相關標籤/搜索