日期:2014-05-16 浏览次数:20466 次
接着上一讲,这一讲主要是讲如何修改adb 的代码让adb 支持中文命令。先说一下我的修改经历。
1) 开始以为只需要把所有的char类型的参数,修改成wchar,然后在发送命令的时候把unicode 编码转换成UTF8编码发送过去就可以了,修改了一会之后发现不行,需要修改的地方忒多了,完全没办法改,后来就直接放弃了着这种想法。
2) 由于考虑到是和文件相关的操作会有问题,比如push,pull, install 等这些命令都和文件相关,所以可以简单的在打开文件和写文件的地方把GBK编码转码UTF8,或者把UTF8转码成GBK编码,试着拿install 命令做了简单的修改,发现确实可以实现中文,但是还是不完美。sync_send 函数的 rpath是手机上的文件路径,传进来的是GBK编码,所以先转码成UTF8编码,然后把UTF8编码的路径发送过去。
文件发送过去之后,就需要调用shell命令来安装了,调用shell命令也是一样的,也需要进行转码。
对于Install 命令来说简单的修改这两个地方就可以了。 字符串的转码有很多,下面把转码的代码贴一下
//GBK 转成 UTF8
#define CP_GBK (936)
GBK_to_UTF8(const char* in, uint32 len, std::string& out)
{
int wbufferlen = (int)::MultiByteToWideChar(CP_GBK,MB_PRECOMPOSED,in,(int)len,NULL,0);
wchar_t* pwbuffer = new wchar_t[wbufferlen+4];
if ( NULL == pwbuffer )
{
return;
}
wbufferlen = (int)::MultiByteToWideChar(CP_GBK,MB_PRECOMPOSED,in,(int)len,pwbuffer,wbufferlen+2);
//wchar_t -> UTF8
int bufferlen = ::WideCharToMultiByte(CP_UTF8,0,pwbuffer,wbufferlen,NULL,0,NULL,NULL);
char* pBuffer = new char[bufferlen + 4];
if ( NULL == pBuffer )
{
delete[] pwbuffer;
return;
}
int out_len = ::WideCharToMultiByte(CP_UTF8,0,pwbuffer,wbufferlen,pBuffer,bufferlen+2,NULL,NULL);
pBuffer[bufferlen] = '\0';
out.assign( pBuffer, out_len );
delete[] pwbuffer;
delete[] pBuffer;
return;
}
//UTF8 转成 GBK
UTF8_to_GBK(const char* in, uint32 len, std::string& out)
{
//1) UTF-8 -> whcar_t
int wbufferlen = (int)::MultiByteToWideChar(CP_UTF8,0,in,(int)len,NULL,0); //may cause error
wchar_t* pwbuffer = new wchar_t[wbufferlen+4];
if ( NULL == pwbuffer )
{
return;
}
wbufferlen = (int)::MultiByteToWideChar(CP_UTF8,0,in,(int)len,pwbuffer,wbufferlen+2);
//2) wchar_t -> GBK
int bufferlen = (int)::WideCharToMultiByte(CP_GBK,0,pwbuffer,wbufferlen,NULL,0,NULL,NULL);
char* pBuffer = new char[bufferlen + 4];
if ( NULL == pBuffer )
{
delete[] pwbuffer;
return;
}
int out_len = ::WideCharToMultiByte(CP_GBK,0,pwbuffer,wbufferlen,pBuffer,bufferlen+2,NULL,NULL);
pBuffer[bufferlen] = '\0';
out.assign( pBuffer, out_len );
delete[] pwbuffer;
delete[] pBuffer;
return;
}