最近做一個項目,需要對接拼多多的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與源碼不一緻?
問題已解決