Отправка значений 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 для подробного обсуждения.