Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JSF проблема с кодировкой


Автор: vzf 16.6.2007, 14:55
Здравствуйте.

Пишу приложение на JSF. Возникла проблема с кодировкой.


Код

<h:outputLink value="#{link.addressForSetup}"
                                                  class="left_menu"
                                                  target="_blank"
                                                  title="#{link.addressForSetup}">


Значение link.addressForSetup тащится из базы данных и представляют собой ссылку на файл.
В ссылке есть как английские так и русские символы.
Проблема заключается в том, что при отрисовки страницы. Титл ссылки (alt) отображается нормальн и русские символы и английсские, но
в значение самой ссылке (href) русские символы отображаются как %251E%2511%2529%2518%2515/6.%252 и поэтому сама ссылка получается неправильной, т.е. при нажатии на нее браузер не может окрыть файл.

Как исправить эту проблему и в чем тут дело? Это мой косяк или бага JSF?

Автор: Stampede 16.6.2007, 16:23
vzf, никакого косяка нет, все по спеку smile

Просто стандартом HTTP предусмотрено определенное множество символов, которые могут присутствовать в URL, и русские буквы, к сожалению, в это множество не попадают. Те символы, которые не входят в число базовых, передаются двоичными кодами. Какими именно - зависит от испольуемой кодировки. Консорциум W3C сильно советует использовать UTF-8 (похоже, в приведенном тобой примере строка закодирована именно в ней).

Для того чтобы программисту самому не страдать с закодированием/раскодированием УРЛов, в Java предусмотрены два класса-утилиты, URLEncoder и URLDecoder, у которых есть соответствующие статические методы encode(String url, String encoding) и decode(String url, String encoding). Вот их как раз и надо использовать для преобразования одного в другое. Вот описания этих классов:
  • http://java.sun.com/j2se/1.4.2/docs/api/java/net/URLEncoder.html
  • http://java.sun.com/j2se/1.4.2/docs/api/java/net/URLDecoder.html

Если файлы, о которых ты говоришь, выдаются напрямую дефолтным сервлетом, то значит надо подменить его своим собственным, который будет правильно раскодировать имена файлов с русскими буквами.

Успехов!

Автор: vzf 29.6.2007, 14:14
Спасибо за разъяснение. С обычными html ссылками у меня получилось, а вот с сылками на локальные ресурсы проблемы.

Вот написал простенькую страницу JSF и бин к ней для демонстрации проблемы.

Бин.

Код

import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;

public class LinkBean {
    public LinkBean() {
    }
    private String link = "\\\\host531\\Книги";

    public void setLink(String link) {
        this.link = link;
    }

    public String getLink() {
        try {
            System.out.println("original link: " + link);
            link = URLEncoder.encode(link,"UTF-8");
            System.out.println("encoded link: " + link);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return link;
    }
}



Страница

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
  <html>
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
      <title>Page 1</title>
    </head>
    <body>
    <h:form>
    <h:outputText value="Link"/>
    <br/>
    <h:outputLink value="#{linkBean.link}"
                  title="тест">
    <h:outputText value="click me"/>
    </h:outputLink>
    
    </h:form>
    </body>
  </html>
</f:view>


После перекодировки получаю.

Код

encoded link: %5C%5Chost531%5C%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8


На странице получается ссылка

Код

http://localhost:8991/linkTest/faces/%5C%5Chost531%5C%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8;jsessionid=0a10095e231f83040d7ca8364824b1338f56cfa42e47


Но это ладно, самое обидное что даже если в браузере вручную вбить

%5C%5Chost531%5C%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8

Ресурс не откроется :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)