开发测试环境
WIN7 SP1 + VC2010
运行测试效果
调用测试
void CTDlg::OnBnClickedButtonUncode( ){
CString strData = “双字节汉字 - ANSI” ;
char buffer[100] = “双字节汉字 - ANSI\0”;
Ansi_To_Uncdode( strData, buffer ) ;
m_strEdit_MSG += _T("\r\n") ;
m_strEdit_MSG += strData ;
Ansi_To_Uncdode( strData ) ;
m_strEdit_MSG += _T("\r\n") ;
m_strEdit_MSG += strData ;
UpdateData( false ) ;
}
void CTDlg::OnBnClickedButtonAnsi( ){
CString strTemp = _T(“单字节汉字 - ANSI”) ;
char buffer[100] = "";
Uncdode_To_Ansi( strTemp ) ;
m_strEdit_MSG += _T("\r\n") ;
m_strEdit_MSG += strTemp ;
UpdateData( false ) ;
}
*// CommFunction.h
#pragma once
bool Uncdode_To_Ansi(CString& strData ) ;
bool Ansi_To_Uncdode( CString& strData ) ;
bool Ansi_To_Uncdode( CString& lpwTarget, LPSTR lpmStr ) ;
/// “CommFunction.cpp”
// Ansi_To_Uncdode
bool Ansi_To_Uncdode( CString& lpwTarget, LPSTR lpSource )
{
DWORD dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpSource, -1, NULL, 0);
CString strTemp ;
strTemp.GetBuffer( dwMinSize*2 ) ;
lpwTarget.GetBuffer( dwMinSize*2 ) ;
LPWSTR lpwDest = (LPWSTR)(LPCSTR)strTemp ;
MultiByteToWideChar( CP_ACP, 0, lpSource, -1, (LPWSTR)(LPCSTR)lpwDest, dwMinSize );
lpwTarget = lpwDest;
//::AfxMessageBox( lpwTarget ) ;
//::AfxMessageBox( (CString)lpwDest ) ;
return true ;
}
// Ansi_To_Uncdode
bool Ansi_To_Uncdode( CString& lpwTarget )
{
CString strSource = lpwTarget ;
LPSTR lpSource = (LPSTR)strSource.GetString() ; // GetBuffer
DWORD dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpSource, -1, NULL, 0);
CString strTemp ;
strTemp.GetBuffer( dwMinSize*2 ) ;
lpwTarget.GetBuffer( dwMinSize*2 ) ;
LPWSTR lpwDest = (LPWSTR)(LPCSTR)strTemp ;
MultiByteToWideChar( CP_ACP, 0, lpSource, -1, (LPWSTR)(LPCSTR)lpwDest, dwMinSize );
lpwTarget = lpwDest;
//::AfxMessageBox( lpwTarget ) ;
//::AfxMessageBox( (CString)lpwDest ) ;
return true ;
}
// Uncdode_To_Ansi
bool Uncdode_To_Ansi(CString& strData )
{
// 输入必须是Unicode,否则,输出编码会出错
if (!strData) return false;
int nLen = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)strData.GetBuffer(), -1, NULL, 0, NULL, NULL);
CString strDest ;
strDest.GetBuffer( nLen + 1 );
LPSTR lpwstr = (LPSTR)(LPCTSTR)strDest.GetBuffer();
LPCWCH lpcch = (LPCWCH)(LPCTSTR)strData.GetBuffer();
WideCharToMultiByte(NULL, 0, lpcch, -1, lpwstr, nLen, NULL, FALSE);
//lpwstr[nLen] = '\0';
//memcpy(strData.GetBuffer(), lpcch, nLen+1) ;
//::AfxMessageBox( (char *)lpcch ) ;
//::AfxMessageBox( strData ) ;
strDest = strData ;
return true ;
}