Eu preciso que o UTF-8 funcione no meu aplicativo da web Java (servlets + JSP, sem estrutura usada) para suportar äöå
etc. para texto finlandês regular e alfabetos cirílico como ЦжФ
em casos especiais.
Minha configuração é a seguinte:
- Ambiente de desenvolvimento: Windows XP
- Ambiente de produção: Debian
Banco de dados usado: MySQL 5.x
Os usuários usam principalmente o Firefox2, mas também o Opera 9.x, FF3, IE7 e Google Chrome são usados para acessar o site.
Como conseguir isso?
Respostas:
Responder a mim mesmo como o FAQ deste site o encoraja. Isso funciona para mim:
Principalmente os caracteres äåö não são problemáticos, pois o conjunto de caracteres padrão usado pelos navegadores e o tomcat / java para webapps é latin1, ie. ISO-8859-1, que "entende" esses caracteres.
Para que o UTF-8 funcione em Java + Tomcat + Linux / Windows + Mysql, é necessário o seguinte:
Configurando o server.xml do Tomcat
É necessário configurar que o conector use UTF-8 para codificar os parâmetros de URL (solicitação GET):
A parte principal sendo URIEncoding = "UTF-8" no exemplo acima. Isso garante que o Tomcat lide com todos os parâmetros GET recebidos como codificados em UTF-8. Como resultado, quando o usuário grava o seguinte na barra de endereços do navegador:
o caractere ж é tratado como UTF-8 e é codificado para (geralmente pelo navegador antes mesmo de chegar ao servidor) como % D0% B6 .
A solicitação POST não é afetada por isso.
CharsetFilter
Chegou a hora de forçar o java webapp a lidar com todos os pedidos e respostas conforme codificado em UTF-8. Isso requer que definamos um filtro de conjunto de caracteres como o seguinte:
Esse filtro garante que, se o navegador não tiver definido a codificação usada na solicitação, esteja definido como UTF-8.
A outra coisa feita por esse filtro é definir a codificação de resposta padrão, ou seja. a codificação na qual o html retornado / o que quer que seja. A alternativa é definir a codificação da resposta etc. em cada controlador do aplicativo.
Esse filtro deve ser adicionado ao web.xml ou ao descritor de implementação do aplicativo da web:
As instruções para criar esse filtro são encontradas no wiki do tomcat ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )
Codificação de página JSP
No seu web.xml , adicione o seguinte:
Como alternativa, todas as páginas JSP do aplicativo da web precisariam ter o seguinte na parte superior:
Se algum tipo de layout com fragmentos JSP diferentes for usado, isso será necessário em todos eles.
Meta tags HTML
A codificação de página JSP informa à JVM para manipular os caracteres na página JSP na codificação correta. Chegou a hora de informar ao navegador em que codificação a página html está:
Isso é feito com o seguinte na parte superior de cada página xhtml produzida pelo aplicativo da web:
Conexão JDBC
Ao usar um banco de dados, é necessário definir que a conexão use a codificação UTF-8. Isso é feito no context.xml ou onde quer que a conexão JDBC seja desativada da seguinte maneira:
Banco de dados MySQL e tabelas
O banco de dados usado deve usar a codificação UTF-8. Isso é alcançado criando o banco de dados com o seguinte:
Em seguida, todas as tabelas também precisam estar em UTF-8:
A parte principal sendo CHARSET = utf8 .
Configuração do servidor MySQL
O servidor MySQL também deve ser configurado. Normalmente, isso é feito no Windows, modificando o arquivo my.ini e no Linux, configurando o arquivo my.cnf . Nesses arquivos, deve-se definir que todos os clientes conectados ao servidor usem utf8 como o conjunto de caracteres padrão e que o conjunto de caracteres padrão usado pelo servidor também seja utf8.
Procedimentos e funções Mysql
Eles também precisam ter o conjunto de caracteres definido. Por exemplo:
Solicitações GET: latin1 e UTF-8
Se e quando for definido no server.xml do tomcat que os parâmetros de solicitação GET sejam codificados em UTF-8, as seguintes solicitações GET serão tratadas adequadamente:
Como os caracteres ASCII são codificados da mesma maneira com latin1 e UTF-8, a sequência "Petteri" é manipulada corretamente.
O caráter cirílico ж não é totalmente compreendido em latim1. Como o Tomcat é instruído a manipular parâmetros de solicitação como UTF-8, ele codifica esse caractere corretamente como % D0% B6 .
Se e quando os navegadores forem instruídos a ler as páginas na codificação UTF-8 (com cabeçalhos de solicitação e metatag html), pelo menos o Firefox 2/3 e outros navegadores desse período codificarão o caractere como % D0% B6 .
O resultado final é que todos os usuários com o nome "Petteri" são encontrados e também todos os usuários com o nome "ж".
Mas e quanto a äåö?
A especificação HTTP define que, por padrão, os URLs são codificados como latin1. Isso resulta no firefox2, firefox3 etc., codificando os seguintes
para a versão codificada
Em latin1, o caractere ä é codificado como % E4 . Mesmo que a página / solicitação / tudo esteja definido para usar UTF-8 . A versão codificada em UTF-8 de ä é % C3% A4
O resultado disso é que é praticamente impossível para o aplicativo da web manipular corretamente os parâmetros de solicitação GET, pois alguns caracteres são codificados em latin1 e outros em UTF-8. Aviso: solicitações POST funcionam como navegadores codificam todos os parâmetros de solicitação de formulários completamente em UTF-8 se a página for definida como sendo UTF-8
Coisas para ler
Muito obrigado pelos escritores a seguir por dar as respostas para o meu problema:
Nota importante
mysqlsuporta o plano multilíngue básico usando caracteres UTF-8 de 3 bytes. Se você precisar ir além disso (determinados alfabetos requerem mais de 3 bytes de UTF-8), será necessário usar um
VARBINARY
tipo de coluna ou usar outf8mb4
conjunto de caracteres (que requer o MySQL 5.5.3 ou posterior). Lembre-se de que o uso doutf8
conjunto de caracteres no MySQL não funcionará 100% do tempo.Tomcat com Apache
Mais uma coisa Se você estiver usando o conector Apache + Tomcat + mod_JK, também precisará fazer as seguintes alterações:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
/etc/httpd/conf
adicioneAddDefaultCharset utf-8
-ahttpd.conf file
. Nota: Primeiro verifique se existe ou não. Se existir, você pode atualizá-lo com esta linha. Você pode adicionar esta linha na parte inferior também.fonte
pageEncoding
, para que você possa deixá-lo de fora. 2) no banco de dados MySQL e nas tabelas que você usouutf8_swedish_si
, deveria ter sidoutf8_unicode_ci
. Você pode até deixar o agrupamento de lado, bastaCHARACTER SET utf8
.<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
2. Vá para a pasta apache, ou seja,/etc/httpd/conf
adicioneAddDefaultCharset utf-8
o arquivo 'httpd.conf'. Nota: primeiro verifique se existe ou não. Se existir, você pode atualizá-lo com esta linha. Você pode adicionar esta linha na parte inferior também.Acho que você resumiu bastante bem em sua própria resposta.
No processo de UTF-8-ing (?) De ponta a ponta, você também pode querer garantir que o próprio java esteja usando UTF-8. Use -Dfile.encoding = utf-8 como parâmetro para a JVM (pode ser configurado em catalina.bat).
fonte
Para adicionar à resposta do kosoant , se você estiver usando o Spring, em vez de escrever seu próprio filtro Servlet, poderá usar a classe que
org.springframework.web.filter.CharacterEncodingFilter
eles fornecem, configurando-a da seguinte forma em seu web.xml:fonte
Também quero adicionar daqui que esta parte resolveu meu problema de utf:
fonte
Isto é para codificação grega nas tabelas MySql quando queremos acessá-las usando Java:
Use a seguinte configuração de conexão no seu pool de conexões JBoss (mysql-ds.xml)
Se você não quiser colocar isso em um conjunto de conexões JNDI, poderá configurá-lo como um JDBC-url, como a próxima linha ilustra:
Para mim e Nick, para nunca mais esquecermos e perdermos tempo ...
fonte
Boa resposta detalhada. só queria adicionar mais uma coisa que definitivamente ajudará outras pessoas a ver a codificação UTF-8 nos URLs em ação.
Siga as etapas abaixo para ativar a codificação UTF-8 em URLs no firefox.
digite "about: config" na barra de endereços.
Use o tipo de entrada de filtro para procurar a propriedade "network.standard-url.encode-query-utf8".
A codificação UTF-8 nos URLs funciona por padrão no IE6 / 7/8 e no chrome.
fonte
Respostas anteriores não funcionaram com o meu problema. Foi apenas em produção, com tomcat e apache mod_proxy_ajp. Post corpo perdeu chars não ascii por? Finalmente, o problema foi com o JVM defaultCharset (US-ASCII em uma instalação padrão: Charset dfset = Charset.defaultCharset ();); portanto, a solução foi executada no servidor tomcat com um modificador para executar a JVM com UTF-8 como charset padrão:
(inclua esta linha em catalina.sh e reinicie o tomcat de serviço)
Talvez você também precise alterar a variável de sistema linux (edite ~ / .bashrc e ~ / .profile para alterações permanentes, consulte https://perlgeek.de/en/article/set-up-a-clean-utf8-environment )
fonte
Estou com um problema semelhante, mas, nos nomes de arquivos de um arquivo, estou compactando com o apache commons. Então, eu resolvi com este comando:
Funciona muito bem para mim. Espero que ajude alguém;)
fonte
No meu caso de exibição de caracteres Unicode em pacotes de mensagens, não preciso aplicar a seção "JSP page codification" para exibir Unicode na minha página jsp. Tudo o que preciso é da seção "CharsetFilter".
fonte
Outro ponto que não foi mencionado diz respeito aos Servlets Java que trabalham com o Ajax. Tenho situações em que uma página da Web está captando texto utf-8 do usuário que está enviando para um arquivo JavaScript que o inclui em um URI enviado ao Servlet. O Servlet consulta um banco de dados, captura o resultado e o retorna como XML para o arquivo JavaScript que o formata e insere a resposta formatada na página da web original.
Em um aplicativo Web, eu estava seguindo as instruções de um livro do Ajax para encerrar o JavaScript na construção do URI. O exemplo no livro usou o método escape (), que eu descobri (da maneira mais difícil) que está errado. Para utf-8, você deve usar encodeURIComponent ().
Hoje em dia, poucas pessoas lançam seu próprio Ajax, mas pensei em acrescentar isso.
fonte
Sobre
CharsetFilter
mencionado na resposta @kosoant ....Existe uma compilação
Filter
no tomcatweb.xml
(localizada emconf/web.xml
). O filtro é nomeadosetCharacterEncodingFilter
e é comentado por padrão. Você pode descomentar isso (lembre-se de descomentarfilter-mapping
também)Também não há necessidade de configurar o
jsp-config
seuweb.xml
(eu testei para o Tomcat 7+)fonte
Algum tempo você pode resolver o problema através do assistente MySQL Administrator. No
e defina Def. conjunto de caracteres: utf8
Talvez essa configuração precise reiniciar o MySQL.
fonte
Enfrentou o mesmo problema no Spring MVC 5 + Tomcat 9 + JSP.
Após a longa pesquisa, chegou a uma solução elegante ( sem necessidade de filtros e há necessidade mudanças no Tomcat server.xml (a partir da versão 8.0.0-RC3))
Na implementação do WebMvcConfigurer, defina a codificação padrão para messageSource (para ler dados de arquivos de origem de mensagens na codificação UTF-8.
Na implementação DispatcherServletInitializer, substitua o método onStartup e defina a codificação de solicitação e de caractere de recurso.
Salve todas as fontes de mensagens e visualize os arquivos na codificação UTF-8.
Adicione <% @ page contentType = "text / html; charset = UTF-8"%> ou <% @ page pageEncoding = "UTF-8"%> em cada arquivo * .jsp ou adicione o descritor jsp-config ao web.xml
fonte
Caso você tenha especificado no conjunto de conexões (mysql-ds.xml), no seu código Java, você pode abrir a conexão da seguinte maneira:
fonte