繁体   English   中英

为什么我必须将utf-8参数String编码为iso-Latin,然后解码为utf-8才能获得Java utf-8 String?

[英]Why do I have to encode a utf-8 parameter String to iso-Latin and then decode as utf-8 to get Java utf-8 String?

我有一个Java Servlet,它带有一个参数String(inputString),其中可能包含来自标记为utf-8的网页的希腊字母。 在将其发送到数据库之前,必须将其转换为新的String(utf8String),如下所示:

String utf8String = new String(inputString.getBytes("8859_1"), "UTF-8");

这行得通,但是,我希望做得到我不希望做的事,即使它行得通,我也希望得到赞赏。

从Java doc中的方法描述中,getBytes()方法“使用命名的字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中”,即我将其编码为8859_1-isoLatin。 并从构造函数说明“通过使用指定的字符集对指定的字节数组进行解码来构造新的String”,即将字节数组解码为utf-8。

有人可以向我解释为什么这是必要的吗?

我的问题基于对HTTP请求所用字符集的误解。 我以为,因为我标记了将请求发送为UTF-8的网页,所以请求将以UTF-8发送,因此发送给servlet的参数中的希腊字符将被读为UTF- 8字符串(我的代码行中的“ inputString”)通过HttpRequest.getParameter()方法。 不是这种情况。

HTTP请求以ISO-8859-1(POST)或ASCII(GET)发送,通常相同。 这是URI语法规范的一部分-感谢Andreas向我指出了http://wiki.apache.org/tomcat/FAQ/CharacterEncoding ,在此处对此进行了说明。

我也忘记了请求的希腊字母(例如α) 的编码URL-encoding ,它产生%CE%B1。 getParameter()通过将其解码为两个ISO-8859-1字符%CE和%B1 —Î和±(我已对此进行检查)来​​处理。

我现在明白为什么需要将其转换为字节数组并将字节解释为UTF-8。 0xCE在UTF-8中不代表一个字节的字符,因此用下一个字节0xB1寻址,将其解释为α。 (在UTF-8中,Î是0xC3 0x8E,±是0xC2 0xB1。)

解码时,您是否无法使用将bytes []作为参数并将其作为字符串返回的解码器方法来创建类? 这是我以前使用过的一个例子。

public class Decoder
{           
   public String decode(byte[] bytes) 
   { 
    //Turns the bytes array into a string
    String decodedString = new String(bytes);
    return decodedString;
   }
}

尝试使用它代替.getBytes()。 希望这行得通。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM