Преобразование кодировки строки Java на веб-странице

У меня есть веб-страница, которая закодирована (через ее заголовок) как WIN-1255, Программа на Java создает текстовую строку, которая автоматически встраивается в страницу. Проблема заключается в том, что исходные строки кодируются в UTF-8, создавая таким образом текстовое поле Gibberish на странице.

К сожалению, я не могу изменить кодировку страницы - это требуется системой соблюдения требований клиента.

Есть идеи?

ОБНОВИТЬ:

Страница, которую я создаю, является RSS-фидом, который должен быть установлен в WIN-1255, показывая информацию, взятую из другого фида, который закодирован в UTF-8.

ВТОРОЕ ОБНОВЛЕНИЕ:

Спасибо за все ответы. Мне удалось преобразовать эту строку, и все же, Gibberish. Проблема заключалась в том, что XML-кодировка должна быть установлена ​​в дополнение к кодировке заголовка.

Адам

5 ответов

Решение

Кстати, вам нужно установить кодировку писателя ответов. Имея только заголовок ответа, вы в основном указываете клиентскому приложению, какую кодировку использовать для интерпретации / отображения страницы. Это не сработает, если сам ответ написан с другой кодировкой.

Контекст, в котором вы столкнулись с этой проблемой, совершенно неясен (пожалуйста, уточните об этом и в будущих проблемах, подобных этой), поэтому здесь есть несколько решений:

Если это JSP, вам нужно установить следующее в верхней части JSP, чтобы установить кодировку ответа:

<%@ page pageEncoding="WIN-1255" %>

Если это Servlet, вам нужно установить следующее перед первым сбросом, чтобы установить кодировку ответа:

response.setCharacterEncoding("WIN-1255");

Оба, кстати, автоматически неявно установить Content-Type заголовок ответа с charset параметр для указания клиенту использовать ту же кодировку для интерпретации / отображения страницы. Также см. Эту статью для получения дополнительной информации.

Если это доморощенное приложение, которое опирается на основные java.net и / или java.io API, то вам нужно написать символы через OutputStreamWriter который создается с использованием конструктора, принимающего 2 аргумента, в которых вы можете указать кодировку:

Writer writer = new OutputStreamWriter(someOutputStream, "WIN-1255");

Предполагая, что у вас есть контроль над оригинальными (правильно представленными) строками, и вам просто нужно вывести их в win-1255:

import java.nio.charset.*;
import java.nio.*;
Charset win1255 = Charset.forName("windows-1255");
ByteBuffer bb = win1255.encode(someString);
byte[] ba = new byte[bb.limit()];

Затем просто напишите содержимое ба в соответствующем месте.

РЕДАКТИРОВАТЬ: То, что вы делаете с ба, зависит от вашей среды. Например, если вы используете сервлеты, вы можете сделать:

ServletOutputStream os = ...
os.write(ba);

Мы также не должны упускать из виду возможный подход вызова setContentType("text/html; charset=windows-1255") ( setContentType), затем с помощью getWriter обычно. Вы не совсем поняли, была ли установлена ​​windows-1255 в метатеге или в заголовке ответа HTTP.

Вы пояснили, что у вас есть файл UTF-8, который нужно декодировать. Если вы еще не правильно декодируете строки UTF-8, это не должно иметь большого значения. Просто посмотрите на InputStreamReader(someInputStream, Charset.forName ("utf-8"))

Что встраивает данные в страницу? Либо он должен прочитать его как текст (в UTF-8), а затем снова записать его в кодировке веб-страницы (Win-1255), либо вам следует изменить программу Java для создания файлов (или чего-либо еще) в Win-1255 для запуска с.

Если вы можете дать более подробную информацию о том, как работает система (что генерирует веб-страницу? Как она взаимодействует с Java-программой?), То это прояснит ситуацию.

Страница, которую я создаю, является RSS-фидом, который должен быть установлен в WIN-1255, показывая информацию, взятую из другого фида, который закодирован в UTF-8.

В этом случае используйте анализатор для загрузки XML UTF-8. Это должно правильно декодировать данные в символьные данные UTF-16 (строки Java всегда UTF-16). Ваш механизм вывода должен кодировать от UTF-16 до Windows-1255.

byte[] originalUtf8;//Here input

//utf-8 to java String:
String internal = new String(originalUtf8,Charset.forName("utf-8");
//java string to w1255 String
byte[] win1255 = internal.getBytes(Charset.forName("cp1255"));

//Here output
Другие вопросы по тегам