Isso só acontecerá quando ambos os lados estiverem perfeitamente cientes das diferenças de codificação de caracteres em cada lado. Qualquer caractere que não seja coberto pela codificação de caracteres usada no outro lado será substituído por um ponto de interrogação
?
. Caso contrário, você teria visto Mojibake
. Nesse caso específico, esses lados são o lado Java e o lado do banco de dados, com o driver JDBC como mediador. Para corrigir isso, você precisa informar ao driver JDBC em que codificação esses caracteres estão. Você pode fazer isso configurando o
useUnicode=true&characterEncoding=UTF-8
parâmetros na URL de conexão JDBC. jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8
Então, dependendo de como você está enviando os parâmetros do cliente para o servidor, você possivelmente também precisa corrigir a codificação da solicitação. Dado que você está vendo Mojibake quando remove
request.setCharacterEncoding("UTF-8")
, você está usando POST. Então essa parte está bem. Para o caso em que, se você estivesse usando GET para enviar os parâmetros, precisaria configurar a codificação de URI no lado do servidor. Não está claro qual servidor você está usando, mas no caso de, por exemplo, o Tomcat, é uma questão de editar o
<Connector>
entrada em /conf/server.xml
do seguinte modo:<Connector ... URIEncoding="UTF-8">