如何将UTF8转换为Unicode

我尝试将UTF8字符串转换为Java Unicode字符串。

String question = request.getParameter("searchWord"); byte[] bytes = question.getBytes(); question = new String(bytes, "UTF-8"); 

输入是中文字符,当我比较每个字符的hex代码时,它是相同的中文字符。 所以我很确定charset是UTF8。

我哪里出错了?

在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字符的十进制值。 如果你有一个方便的hex库方法,你可能想用它来给你hex值。 重点是它会将Unicode字符转储到字符串中。

首先确保数据实际编码为UTF-8。

关于发送HTML表单数据时使用的编码,浏览器之间存在一些不一致。 从Web表单发送UTF-8编码数据的最安全方法是将该表单放在使用Content-Type: text/html; charset=utf-8 Content-Type: text/html; charset=utf-8标头或包含元标记。


现在,在第一次调用request.getParameter()之前,正确解码servlet中的数据调用request.setCharacterEncoding("UTF-8") request.getParameter()

servlet容器为您处理编码。 如果你正确使用setCharacterEncoding() ,你可以期望getParameter()返回普通的Java字符串。

此外,您可能需要一个特殊的filter来处理您的请求的编码。 例如,这样的filter存在于spring框架org.springframework.web.filter.CharacterEncodingFilter

 String question = request.getParameter("searchWord"); 

就是你需要在你的servlet代码中做的一切。 此时你不必处理编码,字符集等。这些都是由servlet-infrastucture处理的。 当您发现显示 ,?,某处等问题时,客户端发送的请求可能有问题。 但是,如果不了解基础设施或记录的HTTP流量,就很难分辨出什么是错误的。

可能。

  question = new String(bytes, "UNICODE");