日期:2014-05-16  浏览次数:20446 次

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

接着上一讲,这一讲主要是讲如何修改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;
}