背景:JAVA InputStreamReader 解析String后乱码
一、.net asp.net api响应,返回不同编码
默认请求返回,utf-8
如果请求header增加,Accept-Charset:utf-16, utf-16be, utf-16le;返回utf-16
二、java 解码响应数据出现乱码
java如果根据application/json; charset=utf-16,InputStreamReader 用utf16解码就会出现乱码。
如果用UTF-16BE解码也是乱码。
如果用UTF-16LE解码,可正常解析。
、
三、UTF-16LE与UTF-16BE区别
Notepad++ HEX-Editor,分析UTF-16LE文件,前2个字节里标记 ff fe
转码为UTF-16BE文件,前2个字节里标记变为 fe ff,7b 00 22 00 变成 00 7b 00 22
UTF-16LE: 最高地址存放高位字节; UTF-16BE: 最低地址存放高位字节。
四、Wireshark捕获.net asp.net api响应分析
7d 00 22 00 对应响应体{",前后0d 0a 是数据分隔符\r\n;没有utf-16 大端和小端区分。
五、asp.net SystemTextJsonOutputFormatter源码解读
SystemTextJsonOutputFormatter只支持UTF-8、Unicode(UTF-16LE);响应数据格式化时根据Accept-Charset获取是哪种编码方式,匹配不到默认UTF-8。
WebName验证:
六、总结
.net asp.net api响应Content-Type=application/json; charset=utf-16默认UTF-16LE,java解码响应也应该用UTF-16LE。