У меня есть веб-приложение, которое использует Primefaces 4 (я не могу его обновить, это не зависит от меня) с таблицей данных со столбцом, в котором иногда есть альфа (греческая буква: α).
Чтобы загрузить эту таблицу данных, я использую кнопку формы с некоторыми фильтрами. Когда я нажимаю на эту кнопку, бэкэнд отправляет мне ответ, используя кодировку ISO-8859-15. Это проблема, потому что с этой кодировкой альфа-каналы представлены в виде вопросительного знака (?), но когда я использую кнопки разбивки на страницы для перехода на вторую страницу, я получаю ответ с использованием кодировки UTF-8, и альфа-каналы представлены правильно, даже если я можно вернуться на первую страницу, и я получаю ответ, используя кодировку UTF-8.
Мне удалось решить эту проблему на моем локальном тестовом сервере Tomcat, изменив кодировку в первой строке файла xhtml:
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?>
Но это не работает на производственном сервере, использующем Weblogic 12c. Данные datatable поступили из класса lazydatamodel, и после него с помощью отладчика он делает то же самое с обеими кнопками, за исключением, очевидно, страницы. Но я оставляю здесь код метода загрузки этого класса lazydatamodel:
private List<ListElement> data;
@Autowired
private transient CamFacade camFacade;
public List<ListElement> load(int first, int pageSize, String sortField,
SortOrder sortOrder, Map<String, String> filters) {
Map<String, Object> params = new HashMap<String, Object>();
params.putAll(filters);
params.put("first", first);
params.put("pageSize", pageSize);
if (sortField == null){
params.put("orderBy", params.get("orderBy"));
params.put("order", params.get("order"));
}else{
params.put("orderBy", sortField);
params.put("order", sortOrder.name());
}
int count = camFacade.countByParams(params);
if (count > 0 ) {
data = camFacade.findByParams(params);
} else {
data = new ArrayList<ListElement>();
}
return data;
}
Обновлено:
Я также пробовал это решение: Ввод Unicode, полученный через компоненты ввода PrimeFaces, повреждается
Но это не работает для меня. Если я не ошибаюсь, с помощью этого кода я меняю кодировку запроса, но на самом деле мой запрос в порядке, это UTF-8. Мне нужно изменить кодировку RESPONSE.
Любая идея, как решить эту проблему?
@JasperdeVries Я пытался, но это не совсем моя проблема. С помощью этого фильтра я могу изменить кодировку запроса, но моя кодировка запроса правильная. Мне нужно изменить кодировку RESPONSE.
Вы также можете установить кодировку ответа в фильтре.
@JasperdeVries Хорошо, я наконец-то заставил его работать, используя фильтр, подобный показанному в этом вопросе. Если вы опубликуете ответ, я отмечу его как решение.
Точно так же, как FYI OmniFaces предоставляет этот фильтр из коробки: showcase.omnifaces.org/filters/CharacterEncodingFilter
Вы можете добавить Filter
, где вы устанавливаете кодировку символов как для запроса, так и для ответа на UTF-8:
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
request.setCharacterEncoding(StandardCharsets.UTF_8.name());
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
chain.doFilter(request, response);
}
// ...
}
Отвечает ли это на ваш вопрос? Ввод Unicode, полученный через компоненты ввода PrimeFaces, искажается