Отправка значений UTF-8 в заголовках HTTP приводит к Mojibake

Я хочу отправить арабские данные из сервлета, используя HTTPServletResponse для клиента

Я пытаюсь это сделать

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);

но похоже, что нет юникода, потому что я получаю странные английские слова, поэтому, пожалуйста, как я могу отправлять и получать арабские слова utf8?

Ответ 1

Заголовки HTTP не поддерживают UTF-8. Они официально поддерживают только ISO-8859-1. См. Также RFC 2616 раздел 2:

Слова * ТЕКСТ МОЖЕТ содержать символы из наборов символов, отличных от ISO-8859-1 [22], только при кодировании в соответствии с правилами RFC 2047 [14].

Лучше всего использовать 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-заголовков таким образом - это дизайнерский запах.

Ответ 2

Я не знаю, откуда происходит переменная word, но попробуйте следующее:

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

ОБНОВЛЕНИЕ. Похоже, проблема связана с кодированными данными UTF-8 в заголовках HTTP, см. кодирование/декодирование заголовков HTTP в Java для подробного обсуждения.