我尝试将一个UTF8字符串转换为Java Unicode字符串。
String question = request.getParameter("searchWord");
byte[] bytes = question.getBytes();
question = new String(bytes, "UTF-8");
输入的是中文字符,当我比较每个字符的十六进制代码时,它们都是相同的中文字符。因此,我非常确定字符集是UTF8。
我错在哪里了?
我尝试将一个UTF8字符串转换为Java Unicode字符串。
String question = request.getParameter("searchWord");
byte[] bytes = question.getBytes();
question = new String(bytes, "UTF-8");
输入的是中文字符,当我比较每个字符的十六进制代码时,它们都是相同的中文字符。因此,我非常确定字符集是UTF8。
我错在哪里了?
String.getBytes()
而没有指定编码,则会使用平台默认编码,这几乎总是一个糟糕的想法。toCharArray()
然后将每个char
转换为int
),并说明您期望接收到的内容。public static void dumpString(String text) {
for (int i = 0; i < text.length(); i++) {
System.out.println(i + ": " + (int) text.charAt(i));
}
}
请注意这将提供每个Unicode字符的十进制值。如果您有一个方便的十六进制库方法,可以使用它来提供十六进制值。主要问题是它将转储字符串中的Unicode字符。首先确保数据实际上已经以UTF-8编码。
不同的浏览器在发送HTML表单数据时使用的编码存在一些不一致性。从Web表单发送UTF-8编码的数据的最安全方法是将该表单放在一个带有Content-Type: text/html; charset=utf-8
头或包含<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
元标记的页面上。
现在,在第一次调用request.getParameter()
之前,在您的servlet中调用request.setCharacterEncoding("UTF-8")
,以便正确解码数据。
servlet容器会为您处理编码。如果您正确使用setCharacterEncoding()
,可以期望getParameter()
返回普通的Java字符串。
setCharacterEncoding("UTF-8")
并使用 request.getParameter()
来获取普通的 Java Unicode 字符串。我猜您的代码也可以处理普通的 ASCII 字符? - Alex JasminString.getBytes()
。 - Alex JasminString question = request.getParameter("searchWord");
在您的servlet代码中,您所要做的就是这样。此时,您无需处理编码、字符集等问题。所有这些都由servlet基础设施处理。当您注意到显示“�”、“?”、“ü”之类的问题时,可能是客户端发送的请求有问题。但是,如果不了解基础设施或已记录的HTTP流量,很难确定出错的原因。
另外,您可能需要一个特殊的过滤器来处理请求的编码。例如,在Spring框架中存在这样的过滤器org.springframework.web.filter.CharacterEncodingFilter
可能。
question = new String(bytes, "UNICODE");