1.通常windows的編碼格式是GBK。但linux可能是gbk也可能是utf-8.可以用 echo $LANG.
2.現在我需要把windows上的文件上傳到linux上。如果linux的編碼格式是gbk,那么恭喜你,不需要做編碼轉換。
如果linux編碼格式utf-8,沒關系,我們做下編碼轉換。如下:
bool CSftpNetEx::_ProcessSendFile(string file_name,string remote_file)
{
if(m_srvTypeChar == CHARACTER_UNICODE)
sftp_utils_space::utils::ConvertGBKToUtf8(remote_file);
...
}
ConvertGBKToUtf8
void ConvertGBKToUtf8(string& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
3.涉及到遠程linux目錄的地方,都有可能需要編碼轉換。如:
上傳、下載、獲取遠程目錄、計算遠程文件的大小、正在下載的文件的顯示、遠程創建文件夾等。
4.在下載文件信息顯示和獲取遠程目錄列表時,由於程序跑在windows上,如果linux上的編碼是utf-8,此時需要把utf-8轉換成GBK。
ConvertUtf8ToGBK
void ConvertUtf8ToGBK(string& strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, (LPWSTR)wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}
5.以上所有轉換都是對路徑的轉換。完!
