vc2008 unicode環境 讀GB312網頁亂碼
由于讀出來以utf-8編碼了,采用下面的讀取方法(只想用這種方法),怎樣將utf8轉換成正常的中文顯示,,
//////////////////////////
#import <msxml4.dll> named_guids
using namespace MSXML2;
CString resaa;
IXMLHTTPRequestPtr httpRes;
HRESULT hr=httpRes.CreateInstance("MSXML2.XMLHTTP");
if(!SUCCEEDED(hr))
{
AfxMessageBox("無法創建XMLHTTP物件,請檢查是否安裝了MS XML運行庫!");
}
LPCTSTR url="http://localhost/changjun/asxml.asp";
httpRes->open("Get",url,false,"","");
httpRes->send();
if((httpRes->readyState)==4) //4時表示資料已加載完
{
resaa=httpRes->responseText.copy();
}
httpRes.Release();
uj5u.com熱心網友回復:
CString 改成 CStringA 也不行uj5u.com熱心網友回復:
只想采用這種讀取方法,但讀出字符轉換總是不成功uj5u.com熱心網友回復:
MultiByteToWideChar轉換一下uj5u.com熱心網友回復:
MultiByteToWideChar 搞了好多次,沒搞定uj5u.com熱心網友回復:
utf-8編碼是MultiByte非Unicode 所以if(m_bUTF8)
{// utf8 file
MultiByteToWideChar(CP_UTF8,0,szBuf,-1,wBuf,2048);
WideCharToMultiByte(CP_ACP,0,wBuf,-1,szBuf,2048,0,0);
}
uj5u.com熱心網友回復:
網頁中有編碼格式,先讀取網頁內容的編碼格式,然后由網頁的編碼格式轉成能正常顯示的格式就ok了。比如:
<script id="allmobilize" charset="utf-8" src="http://a.yunshipei.com/1327c36bdd7197e30fd9f4b48d1a5bcc/allmobilize.min.js"></script>
編碼轉換方法:
// 注釋:多位元組包括GBK和UTF-8
int GBK2UTF8(char *szGbk,char *szUtf8,int Len)
{
// 先將多位元組GBK(CP_ACP或ANSI)轉換成寬字符UTF-16
// 得到轉換后,所需要的記憶體字符數
int n = MultiByteToWideChar(CP_ACP,0,szGbk,-1,NULL,0);
// 字符數乘以 sizeof(WCHAR) 得到位元組數
WCHAR *str1 = new WCHAR[sizeof(WCHAR) * n];
// 轉換
MultiByteToWideChar(CP_ACP, // MultiByte的代碼頁Code Page
0, //附加標志,與音標有關
szGbk, // 輸入的GBK字串
-1, // 輸入字串長度,-1表示由函式內部計算
str1, // 輸出
n // 輸出所需分配的記憶體
);
// 再將寬字符(UTF-16)轉換多位元組(UTF-8)
n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
if (n > Len)
{
delete[]str1;
return -1;
}
WideCharToMultiByte(CP_UTF8, 0, str1, -1, szUtf8, n, NULL, NULL);
delete[]str1;
str1 = NULL;
return 0;
}
//UTF-8 GBK
int UTF82GBK(char *szUtf8,char *szGbk,int Len)
{
int n = MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, NULL, 0);
WCHAR * wszGBK = new WCHAR[sizeof(WCHAR) * n];
memset(wszGBK, 0, sizeof(WCHAR) * n);
MultiByteToWideChar(CP_UTF8, 0,szUtf8,-1, wszGBK, n);
n = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
if (n > Len)
{
delete[]wszGBK;
return -1;
}
WideCharToMultiByte(CP_ACP,0, wszGBK, -1, szGbk, n, NULL, NULL);
delete[]wszGBK;
wszGBK = NULL;
return 0;
}
uj5u.com熱心網友回復:
這個代碼能行?
uj5u.com熱心網友回復:
CString x;UTF82GBK((LPSTR)(LPCTSTR)content,(LPSTR)(LPCTSTR)x,2048);
uj5u.com熱心網友回復:
稿不定稿不定uj5u.com熱心網友回復:
CString x;UTF82GBK((LPSTR)(LPCTSTR)resaa,(LPSTR)(LPCTSTR)x,2048);
uj5u.com熱心網友回復:
你這個搞不定應該不是轉換的問題了,看你所說的環境是unicode程式,那樣的話你顯示前只要拿到unicode編碼的字串就行了,沒必要轉換到ascii編碼,你就把 UTF82GBK 這個函式的前半段拿來用就行了uj5u.com熱心網友回復:
很簡單看我的封裝函式
std::string UnicodeToANSI( std::wstring str ,UINT CodePage)
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CodePage,
0,
str.c_str(),
-1,
NULL,
0,
NULL,
NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte(CodePage,
0,
str.c_str(),
-1,
pElementText,
iTextLen,
NULL,
NULL );
std::string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}
std::wstring ANSIToUnicode(std::string str ,UINT CodePage)
{
wchar_t* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = ::MultiByteToWideChar( CodePage,
0,
str.c_str(),
-1,
NULL,
NULL);
pElementText = new wchar_t[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( wchar_t ) * ( iTextLen + 1 ) );
::MultiByteToWideChar( CodePage ,
0,
str.c_str(),
-1,
pElementText,
iTextLen);
std::wstring strText;
strText = pElementText;
delete[] pElementText;
return strText;
}
第二個引數:采用 CP_UTF8
uj5u.com熱心網友回復:
CString resaa; 在unicode 編譯是CStringWresaa=httpRes->responseText.copy(); copy() 格式是bstr _bsr_t 格式
下面試了幾種方法還不成功
uj5u.com熱心網友回復:
對電腦而言沒有亂碼,只有二進制位元組;對人腦才有亂碼。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8Auj5u.com熱心網友回復:
老師哪咋整老師哪咋整uj5u.com熱心網友回復:
刷水的垃圾貨,葉訓不散。
uj5u.com熱心網友回復:
如果你確定是編碼的問題,你可以先將你的工程屬性設定為多位元組,然后看看能否獲取資料。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/65488.html
標籤:基礎類
