Как установить заголовок ответа в JAX-RS, чтобы китайские символы правильно отображались в пользовательском сгенерированном файле - PullRequest
3 голосов
/ 20 марта 2012

Как правильно сгенерировать «javax.ws.rs.core.Response» (который будет возвращен), который поддерживает китайскую кодировку символов в файле Excel?

Чтобы уточнить, у меня есть файл (CSV)Excel), который содержит некоторый китайский контент, и мне нужно вернуть ответ javax, который затем правильно отображает китайские символы в документе (на стороне клиента).

В настоящее время я делаю следующее:

return Response.status( 200 )
        .header( "content-disposition", 
                 "attachment;filename=SampleCSV.csv;charset=Unicode" )
        .entity( result )
        .build();

, но когда этот ответ создается и возвращается на сторону клиента (и отображается всплывающее окно с просьбой загрузить файл),Китайское содержимое файла excel сгорблено.

Любые предложения будут высоко оценены.

Ответы [ 2 ]

4 голосов
/ 05 мая 2012

RFC , который определяет заголовок размещения контента, не включает предложение charset

Попробуйте также добавить в ответ правильный заголовок типа контента:

.header("Content-Type", "text/csv; charset=utf-8")

Обязательно используйте utf-8, а не unicode. Если это работает, то вы можете удалить предложение charset из заголовка размещения содержимого.

2 голосов
/ 05 мая 2012

Вы указываете 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, и это исправило это для меня.

...