Вы указываете charset=Unicode
, что недопустимо, поскольку Unicode не является отдельной кодировкой.Это набор символов с семейством кодировок.UTF-8 и UTF-16 являются обычно используемыми кодировками.
Вы можете управлять заголовком ответа, чтобы влиять на то, как браузер / клиент интерпретирует ответ, используя аннотацию @Produces
.Я видел разные мнения о том, работает ли это:
Я довольноуверен, что это только изменяет кодировку , объявленную в заголовках ответа;это не меняет кодировку, которая фактически использовала для преобразования строки ответа в байты для отправки по сети.Эти два значения должны совпадать, в противном случае браузер / клиент неверно интерпретирует ответ, поскольку считает, что вы использовали другую кодировку, чем на самом деле.
Если вы возвращаете объект java.lang.String, JAx-RS используетсистемная кодировка по умолчанию для преобразования ее в поток байтов.Если сервер JAX-RS работает в Unix, это UTF-8, который обычно работает хорошо, но в Windows это что-то странное, чего не происходит.
Поэтому вы должны заставить его использовать определенную кодировку,оборачивая результирующий объект в OutputStreamWriter
, который определяет кодировку.Это не позволяет JAX-RS использовать преобразование по умолчанию.
Если конкретно, если result
является объектом java.lang.String в вашем коде, вам может потребоваться создать OutputStreamWriter вокруг него, который задает кодировкунапример, UTF-8, чтобы влиять на поток байтов, который JAX-RS записывает в сеть.Я не тестировал этот код, но он может работать:
.entity(new OutputStreamWriter(result, "UTF-8"))
У меня была эта проблема с Tika , которая отправляет StreamingOutput
вместо Response
, и создаетэто значение по умолчанию OutputStreamWriter
, которое использует кодировку системы по умолчанию вместо чего-то предсказуемого.
I изменил Tika , чтобы указать кодировку при построении OutputStreamWriter
, и добавил charset
к аннотации @Produces
, и это исправило это для меня.