我尝试将UTF8字符串转换为Java Unicode字符串。
String question = request.getParameter("searchWord");
byte[] bytes = question.getBytes();
question = new String(bytes, "UTF-8");
输入是中文字符,当我比较每个字符的十六进制代码时,它是相同的中文字符。所以我很确定charset是UTF8。
我哪里出错了?
答案 0 :(得分:11)
Java中没有“UTF-8字符串”这样的东西。一切都是Unicode。
当您在未指定编码的情况下调用String.getBytes()
时,使用平台默认编码 - 这几乎总是一个坏主意。
你不应该做任何事来在这里找到合适的角色 - 请求应该为你处理。如果它没有这样做,那么它可能已经丢失了数据。
你能举例说明实际出了什么问题吗?在您收到的字符串中指定字符的Unicode值(例如,使用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字符的 decimal 值。如果你有一个方便的十六进制库方法,你可能想用它来给你十六进制值。重点是它将在字符串中转储 Unicode 字符。
答案 1 :(得分:2)
首先确保数据实际编码为UTF-8。
浏览器之间在发送HTML表单数据时使用的编码存在一些不一致。从网络表单发送UTF-8编码数据的最安全方法是将该表单放在使用Content-Type: text/html; charset=utf-8
标头或包含<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
元标记的网页上。
现在,在第一次调用request.setCharacterEncoding("UTF-8")
之前,正确解码servlet中的数据调用request.getParameter()
。
servlet容器负责处理编码。如果正确使用setCharacterEncoding()
,则可以期望getParameter()
返回正常的Java字符串。
答案 2 :(得分:0)
此外,您可能需要一个特殊的过滤器来处理您的请求的编码。例如,此类过滤器存在于spring框架org.springframework.web.filter.CharacterEncodingFilter
答案 3 :(得分:0)
String question = request.getParameter("searchWord");
是您在servlet代码中所要做的。此时你不必处理编码,字符集等。这些都是由servlet-infrastucture处理的。当您发现显示 ,?,某处等问题时,客户端发送的请求可能有问题。但是,如果不了解基础设施或记录的HTTP流量,就很难分辨出什么是错误的。
答案 4 :(得分:-1)
可能。
question = new String(bytes, "UNICODE");