测试后发现存在单数中文乱码问题,
找了半天原来是读取post请求的body时
我用了readLine方法,他默认的是GBK解码,
然而body里的数据是UTF-8编码的
GBK一个字符2个字节,UTF-8一个字符3个字节,
当用GBK去读(解码)UTF-8编码后的内容,
当UTF-8字符是奇数个的时候,GBK解码之后会多出一位字节,那只能用'?'字节(63)来替换
readLine先乱码之后,最后一个字符变为?
所以即使再转码也会出现最后一个中文字符是?的乱码问题
解决方法:
改用inputStream直接读byte,之后再转为utf-8
//字符串读取
void charReader(HttpServletRequest request) {
BufferedReader br = request.getReader();
String str, wholeStr = "";
while((str = br.readLine()) != null){
wholeStr += str;
}
System.out.println(wholeStr);
}
//二进制读取
void binaryReader(HttpServletRequest request) {
int len = request.getContentLength();
ServletInputStream iii = request.getInputStream();
byte[] buffer = new byte[len];
iii.read(buffer, 0, len);
}
网友评论