在HTTP标头中发送UTF-8值会导致Mojibake

我想使用HTTPServletResponse从servlet向客户端发送阿拉伯数据

我正在尝试这个

 response.setCharacterEncoding("UTF-8"); response.setHeader("Info", arabicWord); 

我收到这样的字眼

 String arabicWord = response.getHeader("Info"); 

在客户端(接收)也试过这个

 byte[]d = response.getHeader("Info").getBytes("UTF-8"); arabicWord = new String(d); 

但似乎没有unicode,因为我收到奇怪的英语单词,所以请问我怎样才能发送和接收阿拉伯语utf8单词?

HTTP标头不支持UTF-8。 他们只正式支持ISO-8859-1。 另见RFC 2616 第2节 :

* TEXT的字只有在符合RFC 2047 [14]的规则编码时才包含ISO-8859-1 [22]以外的字符集中的字符。

最好的办法是对它们进行URL编码和解码。

 response.setHeader("Info", URLEncoder.encode(arabicWord, "UTF-8")); 

 String arabicWord = URLDecoder.decode(response.getHeader("Info"), "UTF-8"); 

URL编码将它们转换为%nn格式 ,这是完全有效的ISO-8859-1。 请注意,标头中发送的数据可能具有大小限制。 而是以纯文本,JSON,CSV或XML格式将其发送到响应正文中。 使用自定义HTTP标头这种方式就是设计气味。

我不知道word变量来自哪里,但试试这个:

 arabicWord = new String(d, "UTF-8"); 

更新:看起来问题是HTTP 标头中的 UTF-8编码数据,请参阅: Java头中的HTTP 头编码/解码,以供详细讨论。