在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 标 头编码/解码,以供详细讨论。