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

Tot*_*tti 10 java servlets header http utf-8

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

我正在尝试这个

response.setCharacterEncoding("UTF-8");
response.setHeader("Info", arabicWord);
Run Code Online (Sandbox Code Playgroud)

我收到这样的字眼

String arabicWord = response.getHeader("Info");
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bal*_*usC 31

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

只有当根据RFC 2047 [14]的规则进行编码时,*TEXT的字才能包含ISO-8859-1 [22]以外的字符集中的字符.

您最好的选择是对它们进行URL编码和解码.

response.setHeader("Info", URLEncoder.encode(arabicWord, "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

String arabicWord = URLDecoder.decode(response.getHeader("Info"), "UTF-8");
Run Code Online (Sandbox Code Playgroud)

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