如何将UTF8转换为Unicode

时间:2010-10-29 07:13:30

标签: java character-encoding

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

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

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

我哪里出错了?

5 个答案:

答案 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");