Ansi字符串我們最熟悉,英文占一個字節,漢字2個字節,以一個\0結尾,常用於txt文本文件。
Unicode字符串,每個字符(漢字、英文字母)都占2個字節;在VC++的世界裡,Microsoft比較鼓勵使用Unicode,如wchar_t。
UTF8是Unicode一種壓縮形式,英文A在unicode中表示為0x0041,英語中這種存儲方式太浪費,因為浪費了50%的空間,於是就把英文壓縮成1個字節,成了utf8編碼;但是漢字在utf8中占3個字節,顯然用做中文不如ansi合算,這就是中國的網頁用作ansi編碼而國外的網頁常用utf8的原因。程序中把15.7M大小UTF8格式的txt文件轉化為ANSI後,大小僅為10.8M。
一般情況下,可以通過Windows頭文件下的兩個函數實現各個類型之間的轉換。頭文件添加:
#include <Windows.h>
多字節字符集 -> Unicode字符集
__in DWORD dwFlags, __in LPCSTR lpMultiByteStr, __in cbMultiByte, __out LPWSTR lpWideCharStr, __in cchWideChar );
Unicode字符集 –> 多字節字符集
__in DWORD dwFlags, __in LPCWSTR lpWideCharStr, __in cchWideChar, __out LPSTR lpMultiByteStr, __in cbMultiByte, );
只有一個字符在 CodePage 制定的代碼頁中沒有對應的表示時,WideCharToMultiByte 才會使用後兩個參數。在遇到一個不能轉換的字符時,函數便使用 lpDefaultChar 參數指向的字符。如果這個參數指向為 NULL ,函數就會使用一個默認的字符。這個默認的值通常是一個問號。這對文件操作是非常危險的,因為問號是一個通配符。
程序的頭文件:
<iostream><><fstream><Windows.h> std:: std;
ANSI轉Unicode
* sAnsi = sLen = MultiByteToWideChar(CP_ACP, NULL, sAnsi, -, NULL, * sUnicode = MultiByteToWideChar(CP_ACP, NULL, sAnsi, -,); rtxt.write((*)sUnicode, sLen*= }
Unicode轉ANSI
*sUnicode = L sLen = WideCharToMultiByte(CP_ACP, NULL, sUnicode, -, NULL, * sAnsi = WideCharToMultiByte(CP_ACP, NULL, sUnicode, -= }
Unicode轉UTF8
*sUnicode = L sLen = WideCharToMultiByte(CP_UTF8, NULL, sUnicode, -, NULL, * sUtf8 = WideCharToMultiByte(CP_UTF8, NULL, sUnicode, -, ); =
UTF8轉Unicode
* sUtf8 = sLen = MultiByteToWideChar(CP_UTF8, NULL, sUtf8, -, NULL, * sUnicode = -,*)sUnicode, sLen*=
Ansi轉換utf8和utf8轉換Ansi就是上面2個的結合,把unicode作為中間量,進行2次轉換即可。
在網絡傳輸中,我們常常使用UTF8編碼,但在程序處理時,我們習慣於ANSI編碼,至少目前的VS2010對UTF8碼的顯示是亂碼的。以下函數綜合上述程序,實現了txt文件UTF8編碼向ANSI編碼的轉化。
* changeTxtEncoding(* wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, -, NULL, * wszString = -<<wszString<< ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, -, NULL, , NULL, NULL); * szAnsi = - changeTextFromUtf8ToAnsi( * strLine= strResult=(!+=strLine+* changeTemp= [strResult.length()+=; strcpy(changeTemp, strResult.c_str()); * changeResult==
問題記錄:
a.String類型的length()和size()函數都返回字符串的真實大小,不包括'\0‘ ;
b.char*類型的strlen()函數也是返回字符串的真實大小,不包括'\0‘ ;
c.注意,sizeof()函數包含'\0‘ ,如char str[] = “Hello” ;則sizeof (str ) = 6。