我对来自API的响应有一个奇怪的问题。我正在使用apache HTTP客户端来获取响应。响应标头具有以下内容
Content-Type=[application/json; charset=utf-16]
Transfer-Encoding=[chunked]
X-Powered-By=[ASP.NET] // Yes, people using ASP.NET
因此,基于此,当我收到响应时,我的响应如下所示
笀∀匀琀愀琀甀猀䌀漀搀攀∀㨀㈀
所以我尝试了以下方法。
String body = "笀∀匀琀愀琀甀猀䌀漀搀攀∀㨀㈀";
String charSetString = "utf-8|utf-16|utf-16le, all possible combination"
body = new String(body.getBytes(Charset.forName(charSetString));
body = body.replaceAll("[^\\x00-\\x7F]", "");
但是没有运气。开始看第一个字符。第一个字符的实际响应为{
,我将第一个字符从响应转换为ascii
(int)body.charAt(0)
值是31488
; {
的Ascii值为123;如果我做31488/256 = 123
并将其转换为char给我{
,那么我做了以下
String encoded = "";
for(int i=0; i< body.length(); i++) {
encoded += ((char) ((int)body.charAt(i) / 256 ));
}
它奏效了。但这对于单个API来说太糟糕了。我所缺少的,如果我得到31488
的{{1}},响应的字符集到底是什么?
更新
我的API调用代码。
{
答案 0 :(得分:1)
我认为您的问题是,您错误地认为自己的回复是以UTF-16格式出现的,即您的行Content-Type=[application/json; charset=utf-16]
是错误的。尝试删除字符集部分(Content-Type=[application/json]
)或将其设置为UTF-8(Content-Type=[application/json; charset=utf-8]
),然后看看会发生什么。我相信您得到的答复是:{"StatusCode":2
。不知道为什么答案结尾似乎缺少'}',但除此之外,这还是有道理的。顺便说一句,我设法通过将您的回复字符串转换为unicode序列来解释您的回复。这给了我顺序:\u7b00\u2200\u5300\u7400\u6100\u7400\u7500\u7300\u4300\u6f00\u6400\u6500\u2200\u3a00\u3200
。这样就产生了一个想法,即通过强制将响应解释为utf-16,您弄乱了内容。因此,如果我将序列更改为\u007b\u0022\u0053\u0074\u0061\u0074\u0075\u0073\u0043\u006f\u0064\u0065\u0022\u003a\u0032
并将其从unicodes转换回String,则得到{"StatusCode":2
。
BTW如果您对将任何字符串转换为unicode序列或反之亦然的工具感兴趣,则可以使用MgntUtils开源库(由我编写)。我要做的就是转换您的响应字符串:
String result = "笀∀匀琀愀琀甀猀䌀漀搀攀∀㨀㈀";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
这里是link,描述了库中的实用程序以及在何处获取实用程序(在github和Maven central上都可用)
在文章中查找“ 字符串Unicode转换器”以对此功能进行说明。该库还包含一个简单的Http客户端功能(本文未对此进行介绍,但在其javadoc中进行了描述。