读书人

Android ADB 完善支持中文 详细讲解(

发布时间: 2013-10-22 16:17:03 作者: rapoo

Android ADB 完美支持中文 详细讲解(二)

接着上一讲,这一讲主要是讲如何修改adb 的代码让adb 支持中文命令。先说一下我的修改经历。

1) 开始以为只需要把所有的char类型的参数,修改成wchar,然后在发送命令的时候把unicode 编码转换成UTF8编码发送过去就可以了,修改了一会之后发现不行,需要修改的地方忒多了,完全没办法改,后来就直接放弃了着这种想法。

2) 由于考虑到是和文件相关的操作会有问题,比如push,pull, install 等这些命令都和文件相关,所以可以简单的在打开文件和写文件的地方把GBK编码转码UTF8,或者把UTF8转码成GBK编码,试着拿install 命令做了简单的修改,发现确实可以实现中文,但是还是不完美。sync_send 函数的 rpath是手机上的文件路径,传进来的是GBK编码,所以先转码成UTF8编码,然后把UTF8编码的路径发送过去。

Android ADB 完善支持中文 详细讲解(二)

文件发送过去之后,就需要调用shell命令来安装了,调用shell命令也是一样的,也需要进行转码。

Android ADB 完善支持中文 详细讲解(二)

对于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;
}

如果有错误发生的时候adb 服务进程会返回相应的错误信息,这些错误信息会打印在控制台窗口,由于发送过来的是UTF8编码,fprintf 这个函数在接收一个UTF8编码的中文的时候就会乱码,所以如果还需要正确显示服务进程返回的信息,那就需要把UTF8编码的字符串转换成GBK编码的字符串,然后调用fprintf 函数打印在控制台。

有了上面的一些东西,下一节将会详细的讲解我自己的修改。

群号: 115495155

读书人网 >其他数据库

热点推荐