Pergunta

Eu precisa para obter UTF-8 trabalhando em meu Java webapp (servlets + JSP, nenhum framework utilizado) para apoio äöå etc.para regular finlandês texto e alfabetos Cirílico, como ЦжФ para casos especiais.

Minha configuração é a seguinte:

  • Ambiente de desenvolvimento:Windows XP
  • Ambiente de produção:Debian

Base de dados utilizada:O MySQL 5.x

Os usuários de usar, sobretudo, Firefox2, mas também Opera 9.x, FF3, IE7 e o Google Chrome são utilizados para acessar o site.

Como conseguir isso?

Foi útil?

Solução

Respondendo a mim mesmo como o FAQ do site incentiva-lo.Isso funciona para mim:

A maioria caracteres äåö não é um problemático como o conjunto de caracteres padrão utilizado pelos navegadores e tomcat/java para aplicações web é latin1 ie.ISO-8859-1, que "entende" esses caracteres.

Para obter UTF-8 a trabalhar em Java+Tomcat+Linux/Windows+Mysql requer o seguinte:

A configuração do Tomcat server.xml

É necessário configurar o conector usa UTF-8 para codificar a url (pedido GET) parâmetros:

<Connector port="8080" maxHttpHeaderSize="8192"
 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
 enableLookups="false" redirectPort="8443" acceptCount="100"
 connectionTimeout="20000" disableUploadTimeout="true" 
 compression="on" 
 compressionMinSize="128" 
 noCompressionUserAgents="gozilla, traviata" 
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
 URIEncoding="UTF-8"
/>

A parte chave a ser URIEncoding="UTF-8" no exemplo acima.Este quarantees que o Tomcat processa todas as chamadas de OBTER parâmetros como a codificação UTF-8.Como resultado, quando o usuário escreve o seguinte para a barra de endereços do navegador:

 https://localhost:8443/ID/Users?action=search&name=*ж*

o personagem ж é tratada como UTF-8 e é codificado (normalmente pelo browser antes mesmo de chegar ao servidor) como %D0%B6.

Solicitação POST não são afetados por esta.

CharsetFilter

Em seguida, é hora de forçar o java webapp para lidar com todos os pedidos e respostas de como a codificação UTF-8.Isso exige que define um conjunto de caracteres de filtro, como a seguir:

package fi.foo.filters;

import javax.servlet.*;
import java.io.IOException;

public class CharsetFilter implements Filter {

    private String encoding;

    public void init(FilterConfig config) throws ServletException {
        encoding = config.getInitParameter("requestEncoding");
        if (encoding == null) encoding = "UTF-8";
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
            throws IOException, ServletException {
        // Respect the client-specified character encoding
        // (see HTTP specification section 3.4.1)
        if (null == request.getCharacterEncoding()) {
            request.setCharacterEncoding(encoding);
        }

        // Set the default response content type and encoding
        response.setContentType("text/html; charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        next.doFilter(request, response);
    }

    public void destroy() {
    }
}

Este filtro garante que, se o navegador não tiver definido a codificação usada no pedido, que é configurado para UTF-8.

A outra coisa que foi feita por este filtro é para definir o padrão de codificação da resposta do ie.a codificação em que o html retornado/o que quer que seja.A alternativa é definir a codificação de resposta, etc.em cada controlador de aplicação.

Este filtro tem de ser adicionado para o web.xml ou o descritor de implementação do webapp:

 <!--CharsetFilter start--> 

  <filter>
    <filter-name>CharsetFilter</filter-name>
    <filter-class>fi.foo.filters.CharsetFilter</filter-class>
      <init-param>
        <param-name>requestEncoding</param-name>
        <param-value>UTF-8</param-value>
      </init-param>
  </filter>

  <filter-mapping>
    <filter-name>CharsetFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

As instruções para fazer este filtro, se encontram a tomcat wiki (http://wiki.apache.org/tomcat/Tomcat/UTF-8)

Página JSP codificação

Em seu web.xml, adicione o seguinte:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

Em alternativa, todos os JSP-páginas da webapp precisa ter o seguinte no topo delas:

 <%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>

Se algum tipo de layout com diferentes JSP-fragmentos é usado, então isso é necessário em todos deles.

HTML-meta tags

Página JSP codificação conta a JVM para processar os caracteres na página JSP na codificação correta.Em seguida, é hora de dizer o navegador no qual a codificação do html da página é:

Isso é feito com o seguinte na parte superior de cada página xhtml produzido pelo webapp:

   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi">
   <head>
   <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
   ...

JDBC-conexão

Quando utilizar um banco de dados, ele tem que ser definido que a conexão usa a codificação UTF-8.Isso é feito em context.xml ou onde quer que a conexão JDBC é defiend da seguinte forma:

      <Resource name="jdbc/AppDB" 
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="20" maxIdle="10" maxWait="10000"
        username="foo"
        password="bar"
        driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/      ID_development?useEncoding=true&amp;characterEncoding=UTF-8"
    />

O MySQL de banco de dados e tabelas

O banco de dados usado deve utilizar a codificação UTF-8.Isto é conseguido através da criação de banco de dados com o seguinte:

   CREATE DATABASE `ID_development` 
   /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */;

Em seguida, todas as tabelas precisam estar em UTF-8 também:

   CREATE TABLE  `Users` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `name` varchar(30) collate utf8_swedish_ci default NULL
    PRIMARY KEY  (`id`)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=DYNAMIC;

A parte chave a ser CHARSET=utf8.

Configuração do servidor MySQL

MySQL serveri tem de ser configurado também.Normalmente, isso é feito no Windows modificando o meu.ini -arquivo e no Linux configurando o meu.cnf -arquivo.Nesses arquivos, ele deve ser definido que todos os clientes conectados ao servidor use utf8 como o conjunto de caracteres padrão e que o charset padrão usada pelo servidor também é utf-8.

   [client]
   port=3306
   default-character-set=utf8

   [mysql]
   default-character-set=utf8

Mysql funções e procedimentos

Estes também precisa ter o conjunto de caracteres definidos.Por exemplo:

   DELIMITER $$

   DROP FUNCTION IF EXISTS `pathToNode` $$
   CREATE FUNCTION `pathToNode` (ryhma_id INT) RETURNS TEXT CHARACTER SET utf8
   READS SQL DATA
   BEGIN

    DECLARE path VARCHAR(255) CHARACTER SET utf8;

   SET path = NULL;

   ...

   RETURN path;

   END $$

   DELIMITER ;

Solicitações GET:latin1 e UTF-8

Se e quando é definido no do tomcat server.xml que pedido GET parâmetros são codificados em UTF-8, o seguinte recebo pedidos são processados corretamente:

   https://localhost:8443/ID/Users?action=search&name=Petteri
   https://localhost:8443/ID/Users?action=search&name=ж

Porque ASCII caracteres são codificados da mesma maneira com o latin1 e UTF-8, a seqüência de caracteres "Petteri" é tratada corretamente.

O caractere Cirílico ж não é compreendido em todos os em latin1.Porque o Tomcat é indicado para lidar com pedido de parâmetros como a codificação UTF-8 codifica o personagem corretamente como %D0%B6.

Se e quando os navegadores são instruídos a ler as páginas em codificação UTF-8 (com pedido de cabeçalhos html e meta-tag), pelo menos Firefox 2/3 e outros navegadores, neste período, todos codificar o carácter-se como %D0%B6.

O resultado final é que todos os usuários com o nome de "Petteri" são encontrados e também todos os usuários com o nome de "ж" são encontrados.

Mas o que sobre äåö?

HTTP-especificação define que, por padrão URLs são codificados como latin1.Isso resulta em firefox2, firefox3 etc.a codificação a seguir

    https://localhost:8443/ID/Users?action=search&name=*Päivi*

para a versão codificada

    https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*

Em latin1 o personagem ä é codificado como %E4. Mesmo que a página/pedido/tudo é definido para usar UTF-8.O UTF-8 codificado versão ä é %C3%A4

O resultado disso é que é completamente impossível para o webapp para correly manipular os parâmetros de solicitação de pedidos GET como alguns caracteres são codificados em latin1 e outros em UTF-8.Aviso:Solicitações POST funcionam como navegadores codificar todos os parâmetros de solicitação de formas completamente em UTF-8 se a página é definido como sendo a codificação UTF-8

Material para leitura

Um grande obrigado para os escritores dos seguintes para dar as respostas para o meu problema:

  • http://tagunov.tripod.com/i18n/i18n.html
  • http://wiki.apache.org/tomcat/Tomcat/UTF-8
  • http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/
  • http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-tomcat-jsp-etc.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-for-mysql-tomcat.html
  • http://jeppesn.dk/utf-8.html
  • http://www.nabble.com/request-parameters-mishandle-utf-8-encoding-td18720039.html
  • http://www.utoronto.ca/webdocs/HTMLdocs/NewHTML/iso_table.html
  • http://www.utf8-chartable.de/

Nota Importante

suporta a O Plano Multilíngüe Básico usando de 3 bytes de caracteres UTF-8.Se você precisa ir lá fora de que certos alfabetos exigir mais de 3 bytes de UTF-8), em seguida, você precisa usar um sabor de VARBINARY tipo de coluna ou usar o utf8mb4 conjunto de caracteres (o que requer o MySQL 5.5.3 ou posterior).Basta estar ciente de que a utilização do utf8 conjunto de caracteres do MySQL não irá funcionar 100% do tempo.

O Tomcat com o Apache

Mais uma coisa, Se você estiver usando o Apache + Tomcat + mod_JK conector, em seguida, você também precisa seguir os seguintes alterações:

  1. Adicionar URIEncoding="UTF-8" no tomcat server.xml arquivo para 8009 conector, ele é usado por mod_JK conector. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
  2. Goto sua pasta apache i.e. /etc/httpd/conf e o adicione AddDefaultCharset utf-8 no httpd.conf file. Nota: Primeiro verifique se está a existir ou não.Se existir, você pode atualizá-lo com esta linha.Você pode adicionar esta linha no fundo também.

Outras dicas

Eu acho que você resumiu muito bem em sua própria resposta.

No processo de UTF-8-ing (?) De ponta a ponta, você também pode querer certificar-se de java em si está usando UTF-8. Uso -Dfile.encoding = UTF-8 como parâmetro para a JVM (pode ser configurado em catalina.bat).

Para adicionar de kosoant resposta , se você estiver usando Spring, ao invés de escrever seu próprio filtro de Servlet, você pode usar o org.springframework.web.filter.CharacterEncodingFilter classe que fornecem, configurando-o como o seguinte no seu web.xml:

 <filter>
    <filter-name>encoding-filter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
       <param-name>encoding</param-name>
       <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
       <param-name>forceEncoding</param-name>
       <param-value>FALSE</param-value>
    </init-param>
 </filter>
 <filter-mapping>
    <filter-name>encoding-filter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>

Eu também quero adicionar a partir aqui esta parte resolveu o meu problema utf:

runtime.encoding=<encoding>

Isto é para grego Encoding em tabelas MySQL quando queremos acessá-los usando Java:

Use a seguinte configuração de conexão em seu JBoss pool de conexão (mysql-ds.xml)

<connection-url>jdbc:mysql://192.168.10.123:3308/mydatabase</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>nts</user-name>
<password>xaxaxa!</password>
<connection-property name="useUnicode">true</connection-property>
<connection-property name="characterEncoding">greek</connection-property>

Se você não quer colocar isso em um pool de conexão JNDI, você pode configurá-lo como um JDBC-url como a próxima linha ilustra:

jdbc:mysql://192.168.10.123:3308/mydatabase?characterEncoding=greek

Para mim e Nick, então nós nunca esquecê-lo e perder tempo mais .....

Nice detalhada resposta. só queria acrescentar mais uma coisa que vai certamente ajudar os outros a ver a codificação UTF-8 em URLs em ação.

Siga os passos abaixo para permitir codificação UTF-8 em URLs no Firefox.

  1. digite "about: config". Na barra de endereços

  2. Use o tipo de entrada do filtro de pesquisa para "network.standard-url.encode-query-utf8" propriedade.

  3. a propriedade acima será falso por padrão, transformar isso para TRUE.
  4. reiniciar o navegador.

UTF-8 em URLs obras por padrão no IE6 / 7/8 e cromo.

Estou com um problema semelhante, mas, em nomes de arquivos de um arquivo Eu estou comprimindo com Apache Commons. Então, resolvi-lo com este comando:

convmv --notest -f cp1252 -t utf8 * -r

ele funciona muito bem para mim. Espero que isso ajuda ninguém;)

Para o meu caso de exibir caracteres Unicode de pacotes de mensagens, eu não preciso seção "JSP página de codificação" para exibir Unicode na minha página jsp para aplicar. Todos necessidade I é a secção "CharsetFilter".

Um outro ponto que não tenha sido fornecido refere-se Servlets Java que trabalham com Ajax. Tenho situações em que uma página web está pegando utf-8 texto do usuário enviando este para um arquivo JavaScript que inclui-lo em um URI enviado para o Servlet. O Servlet consulta um banco de dados, captura o resultado e retorna como XML para o arquivo JavaScript que formata-lo e insere a resposta formatado na página da web original.

Em um aplicativo web eu estava seguindo instruções de um livro Ajax cedo para embalar o JavaScript na construção do URI. O exemplo no livro usado o método escape (), que eu descobri (da maneira mais difícil) é errado. Para utf-8 você deve usar encodeURIComponent ().

Poucas pessoas parecem rolar seu próprio Ajax nos dias de hoje, mas eu pensei que eu poderia muito bem adicionar este.

Sobre CharsetFilter mencionado na resposta @kosoant ....

Há uma construção em Filter em web.xml tomcat (localizado na conf/web.xml). O filtro é chamado setCharacterEncodingFilter e é comentado por padrão. Você pode descomentar esta (Por favor, lembre-se de descomentar a sua filter-mapping também)

Também não há necessidade de jsp-config set em sua web.xml (eu tenho testá-lo para Tomcat 7+)

Algumas vezes você pode resolver o problema através MySQL Administrator assistente. Em

variáveis ??de inicialização> Avançado>

e set Def. Char Set: utf8

Talvez esta configuração necessidade de reinício MySQL.

respostas anteriores não funcionou com o meu problema. Foi só na produção, com tomcat e apache mod_proxy_ajp. Pós corporal perdido caracteres não ascii por? O problema finalmente foi com JVM DefaultCharset (US-ASCII em uma instalação padrão: Charset dfset = Charset.defaultCharset ();) Assim, a solução foi executado tomcat servidor com um modificador para executar a JVM com UTF-8 como charset padrão:

JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" 

(adicionar esta linha ao catalina.sh e serviço tomcat reinicialização)

Talvez você também deve variável sistema de mudança de linux (edit ~ / .bashrc e ~ / .profile para a mudança permanente, veja https://perlgeek.de/en/article/set-up-a-clean-utf8-environment )

export LC_ALL = en_US.UTF-8
export LANG = en_US.UTF-8

exportação LANGUAGE = en_US.UTF-8

Diante da mesma questão em Spring MVC 5 + Tomcat 9 + JSP.
Após a longa pesquisa, chegou a uma solução elegante ( não necessidade filtros e não necessidade altera no Tomcat < strong> server.xml (a partir de 8.0.0-RC3 versão))

  1. Na codificação do conjunto padrão de implementação WebMvcConfigurer para MessageSource (para leitura de dados de arquivos de origem mensagens na codificação UTF-8.

    @Configuration
    @EnableWebMvc
    @ComponentScan("{package.with.components}")
    public class WebApplicationContextConfig implements WebMvcConfigurer {
    
        @Bean
        public MessageSource messageSource() {
            final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    
            messageSource.setBasenames("messages");
            messageSource.setDefaultEncoding("UTF-8");
    
            return messageSource;
        }
    
        /* other beans and methods */
    
    }
    
  2. Na implementação DispatcherServletInitializer @Override o método OnStartup e conjunto de solicitação e recurso de codificação de caracteres na mesma.

    public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        @Override
        public void onStartup(final ServletContext servletContext) throws ServletException {
    
            // https://wiki.apache.org/tomcat/FAQ/CharacterEncoding
            servletContext.setRequestCharacterEncoding("UTF-8");
            servletContext.setResponseCharacterEncoding("UTF-8");
    
            super.onStartup(servletContext);
        }
    
        /* servlet mappings, root and web application configs, other methods */
    
    }
    
  3. Salvar todos os arquivos de origem e exibição de mensagens em codificação UTF-8.

  4. Adicionar <% @ page contentType = "text / html; charset = UTF-8" %> ou <% @ page pageEncoding = "UTF-8" %> em cada * arquivo .jsp ou adicionar jsp-config descritor para web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     id="WebApp_ID" version="3.0">
        <display-name>AppName</display-name>
    
        <jsp-config>
            <jsp-property-group>
                <url-pattern>*.jsp</url-pattern>
                <page-encoding>UTF-8</page-encoding>
            </jsp-property-group>
        </jsp-config>
    </web-app>
    

Caso você tenha especificado no pool de conexão (mysql-ds.xml), em seu código Java você pode abrir a conexão da seguinte forma:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Connection conn = DriverManager.getConnection(
    "jdbc:mysql://192.168.1.12:3308/mydb?characterEncoding=greek",
    "Myuser", "mypass");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top