Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将UTF8转换为Unicode_Java_Character Encoding - Fatal编程技术网

Java 如何将UTF8转换为Unicode

Java 如何将UTF8转换为Unicode,java,character-encoding,Java,Character Encoding,我尝试将UTF8字符串转换为Java Unicode字符串 String question = request.getParameter("searchWord"); byte[] bytes = question.getBytes(); question = new String(bytes, "UTF-8"); 输入是中文字符,当我比较每个字符的十六进制代码时,它是相同的中文字符。所以我很确定字符集是UTF8 哪里出错了?Java中没有“UTF-8字符串”这样的东西。一切都是Unicode

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

String question = request.getParameter("searchWord");
byte[] bytes = question.getBytes();
question = new String(bytes, "UTF-8");
输入是中文字符,当我比较每个字符的十六进制代码时,它是相同的中文字符。所以我很确定字符集是UTF8


哪里出错了?

Java中没有“UTF-8字符串”这样的东西。一切都是Unicode

当您在不指定编码的情况下调用
String.getBytes()
时,使用平台默认编码——这几乎总是一个坏主意

您不必做任何事情来获得正确的字符-请求应该为您处理所有这些。如果它没有这样做,那么很可能它已经丢失了数据

你能举个例子说明到底出了什么问题吗?指定您正在接收的字符串中字符的Unicode值(例如,使用
ToCharray()
,然后将每个
char
转换为
int
)以及您希望接收的内容

编辑:要诊断此问题,请使用以下方法:

public static void dumpString(String text) {
    for (int i = 0; i < text.length(); i++) {
        System.out.println(i + ": " + (int) text.charAt(i));
    }
}
公共静态无效转储字符串(字符串文本){
对于(int i=0;i

请注意,这将给出每个Unicode字符的十进制值。如果您有一个方便的十六进制库方法,您可能希望使用它来获得十六进制值。要点是它将转储字符串中的Unicode字符。

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

关于发送HTML表单数据时使用的编码,浏览器之间存在一些不一致。从web表单发送UTF-8编码数据最安全的方法是将表单放在一个页面上,该页面使用
内容类型:text/html;charset=utf-8
标题或包含
元标记


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


servlet容器负责为您进行编码。如果正确使用
setCharacterEncoding()
,您可以期望
getParameter()
返回正常的Java字符串。

此外,您可能还需要一个特殊的过滤器来处理请求的编码。例如,这种过滤器存在于springframework
org.springframework.web.filter.CharacterEncodingFilter

String question = request.getParameter("searchWord");
是您在servlet代码中所要做的全部工作。此时,您不必处理编码、字符集等。这些都由servlet基础结构处理。当您注意到显示等问题时�, ?, ü在某个地方,客户发送的请求可能有问题。但是,如果不了解基础设施或记录的HTTP流量,就很难判断出什么是错误的

可能

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

告 例如,这个字符需要转换,我得到229 145 138这个十进制表示,这是正确的,因为它是十六进制表示:E5 91 8A,所以现在我需要将它转换为unicode。ISo在我看来,请求发送了正确的字符,但我无法在java中读取这些字符,它需要转换为unicode@Rob:否,应在字符串中显示为U+544A。您引用的十六进制表示法是UTF-8表示法,它永远不会是字符串本身的表示法。你说你“得到”229 145 138-当你做什么?我将用一些诊断代码编辑我的答案。现在,当我转换时,我得到每个字符的unicode 63表示形式,所以我猜我的转换仍然是正确的wrong@Rob你不应该进行任何手动转换。您应该调用
setCharacterEncoding(“UTF-8”)
并使用
request.getParameter()
获取普通的Java Unicode字符串。我想你的代码也可以使用普通的ascii字符?请使用@Jon Skeet代码片段来获取每个字符的Unicode代码点,而不是
String.getBytes()
@Alexandre Jasmin:非常感谢,你真的让我开心!