Преобразование кодировки строки 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