Java中如何在Authorization头中设置UTF-8编码内容?
解决Java中OAuth 1.0a认证头的UTF-8处理问题
首先你不用纠结Java字符串的UTF-16存储问题,核心逻辑如下:
- 你已经完成了RFC3985要求的百分编码,把所有非ASCII字符转成了
%XX格式的ASCII字符(比如Hello World!变成Hello%20World%21)。这些编码后的字符串全由ASCII范围内的字符组成,而ASCII在UTF-8和ISO-8859-1编码中完全兼容。 - 调用
setRequestProperty传入该编码后的字符串时,HttpsURLConnection会按HTTP协议默认编码(ISO-8859-1)将字符串转成字节流发送。但因为内容全是ASCII字符,转成UTF-8字节流的结果和ISO-8859-1完全一致,服务器接收后可以正确解析。
如果出现百分编码后仍有非ASCII字符的特殊情况(按OAuth1.0a规范不应出现),可以通过以下方式强制发送UTF-8编码的头:
- 手动构造HTTP头字节数组,绕过
setRequestProperty直接操作底层流(注意这种方式需要自行处理整个HTTP请求的构建,较为繁琐):String authHeaderValue = "OAuth ..."; // 已完成百分编码的OAuth头内容 byte[] utf8Bytes = authHeaderValue.getBytes(StandardCharsets.UTF_8); // 后续自行处理请求流写入逻辑
另外务必确认你的百分编码逻辑正确:所有非ASCII字符都要转换成UTF-8字节对应的百分编码,比如中文测试应编码为%E6%B5%8B%E8%AF%95。
总结:只要你的百分编码严格基于UTF-8字节实现,直接把编码后的字符串传给setRequestProperty即可,服务器能正确识别。Java内部的UTF-16存储不会影响最终发送的字节流,因为编码后的内容都是ASCII字符,跨编码兼容。
内容的提问来源于stack exchange,提问作者HLR
相关产品推荐
相关产品推荐

