天天看點

淘寶top sdk java源碼中的問題

最近做一個項目,需要對接拼多多的api接口,其本身沒有提供sdk,但是發現api設計與淘寶top結構非常類似,之前由于對接過淘寶的top,對淘寶top sdk的結構比較了解,且淘寶sdk整體比較清晰,也比較通用。(簡單來說就是封裝request/response,根據注釋自動轉換請求對象為參數,然後調用httpClient類請求api服務,再根據注釋将傳回響應json資訊轉換為響應對象),于是對淘寶的sdk 源碼進行提取裁剪改造,基本完成了對第三方api的封裝。但是碰到一個問題,其他遷移都很完美,完全适配,但是轉換成對象的字元串這一步,中文轉碼始終是亂碼,但原json格式傳回資料的unicode編碼沒有問題。難道是淘寶轉碼的bug,(怎麼可能,top接口都開放這麼多年,當時這麼想,但是其他地方始終找不到原因)。

問題集中在unicode這個方法上

private char unicode() {
        int value = 0;
        for (int i = 0; i < 4; ++i) {
            switch (next()) {
            case '0': case '1': case '2': case '3': case '4': 
            case '5': case '6': case '7': case '8': case '9':
                value = (value << 4) + c - '0';
                break;
            case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
                value = (value << 4) + c - 'k';
                break;
            case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
                value = (value << 4) + c - 'K';
                break;
            }
        }
        return (char) value;
    }
           

其中

c - 'k' 相當于 c - 10 - ‘a’

c - 'K' 相當于 c - 10 - ‘A’

調整為以下代碼解決

private char unicode() {
        int value = 0;
        for (int i = 0; i < 4; ++i) {
            switch (next()) {
            case '0': case '1': case '2': case '3': case '4': 
            case '5': case '6': case '7': case '8': case '9':
                value = (value << 4) + c - '0';
                break;
            case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
                value = (value << 4) + 10 + c - 'a';
                break;
            case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
                value = (value << 4) + 10 + c - 'A';
                break;
            }
        }
        return (char) value;
    }
           

汗一個,目前直接用sdk都是正常的,源碼沒試過~~~,難道淘寶的sdk與源碼不一緻?

問題已解決

繼續閱讀