2010-10-09 17 views
2

J'ai une application Web qui recueille des données de l'utilisateur et les enregistre dans une base de données mysql. Le problème est que pour une chaîne comme "Ajánlat kiküldése", ce qui est stocké dans la base de données est "Ajállat kiküldée".struts, hibernate, problème d'encodage mysql-char

Pour ma base de données, j'ai DEFAULT CHARACTER SET utf8. Pour mes tables j'ai DEFAULT CHARSET = utf8.

Dans mon hibernate.cfg.xml j'ai:

<property name="hibernate.connection.useUnicode">true</property> 
<property name="hibernate.connection.characterEncoding">UTF-8</property> 
<property name="hibernate.connection.charSet">UTF-8</property> 

Si j'entre "ajánlat kiküldése" directement dans la base de données en utilisant un client MySQL, le texte est stocké correctement. Ainsi, quelque part au long de ma demande, le texte est modifié.

J'ai dans ma page JSPX:

<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/> 

Pour ma forme, j'utiliser sutrts html taglib et le code est très simple:

<html:form action="/submitAddProject"> 
      <table> 
       <tr> 
        <td>name</td> 
        <td> 
         <html:text property="projectNameToAdd"/> 
        <td> 
       etc. 

Sur soumettre, quand je fais myForm.getProjectNameToAdd , J'ai un texte différent de celui que j'entre dans le formulaire. (Ajánlat kiküldà © au lieu de se ajánlat kiküldése)

+0

Encore une chose: quand je rentre le texte manuellement dans la base de données, il s'affiche correctement dans mon application. Le problème apparaît uniquement lors de l'enregistrement du texte. – Mihaela

+0

Et avant de faire la sauvegarde sur la base de données, quand j'appelle un getter sur mon champ String qui pose problème, je reçois déjà le texte dans le mauvais encodage. Il semble donc que le problème ne se pose pas lorsque j'essaie d'enregistrer sur db, mais lorsque les champs de mon objet formulaire sont remplis depuis la page html, plus exactement, la chaîne reçue par le stter est déjà tordue et différente de la chaîne saisie dans le champ de texte. – Mihaela

+0

utilisez-vous une connexion framewrok de connexion? – fmucar

Répondre

1

Vous pouvez essayer de créer le filtre suivant:

public class Utf8EncodingFilter implements Filter { 

public void init(FilterConfig config) throws ServletException {} 

public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) 
throws IOException, ServletException { 
    request.setCharacterEncoding("utf-8"); 
    next.doFilter(request, response); 
} 

public void destroy(){} 
} 

MISE À JOUR: Vous devez créer classe Utf8EncodingFilter, l'interface importation de filtre, exception, etc. (n'importe quel IDE moderne le fera pour vous). Ensuite, vous devez ajouter ce filtre dans votre descripteur de déploiement (peut être trouvé au WEB-INF/web.xml) en utilisant la syntaxe suivante:

<filter> 
    <filter-name>UTF-8 Encoding Filter</filter-name> 
    <filter-class>com.example.Utf8EncodingFilter</filter-class> 
    </filter> 

    <filter-mapping> 
    <filter-name>UTF-8 Encoding Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Vous pouvez en savoir plus sur les filtres ici: http://www.ibm.com/developerworks/java/library/j-pj2ee10.html

+0

Sry mais comment dois-je utiliser cette classe? Où le mettre? :) Dans les entretoises, il y a une servlet appelée contrôleur je pense, qui appelle la réinitialisation et les setters pour mon objet de formulaire. Lorsque le setter est appelé, il reçoit déjà un mauvais encodage de char. Donc, la forme a de bonnes données, le setter reçoit de mauvaises données.Quelque part le long du chemin, quelqu'un tord les données. – Mihaela

+0

Vous devez créer une classe Utf8EncodingFilter, importer une interface de filtre, une exception, etc. (tout IDE moderne fera cela pour vous). Ensuite, vous devez ajouter ce filtre dans votre descripteur de déploiement (peut être trouvé sur WEB-INF/web.xml) en utilisant la syntaxe suivante: – Roman

+0

non, la syntaxe est manquante :) veuillez réessayer. l'édition de débordement de pile est un peu étrange :) – Mihaela

2

I avait un problème similaire, mais mon problème était directement avec hibernate sauver les données dans MySQL. Le problème peut être facilement résolu en ajoutant useUnicode = true & characterEncoding = UTF-8 à votre chaîne de connexion dans le fichier de configuration.

Par exemple: jdbc.databaseurl = jdbc: mysql: // localhost: 3306/myHibernateDB useUnicode = true & CharacterEncoding = UTF-8

travaillé pour moi comme un morceau de magie.

C'est l'article qui en parle: http://www.isocra.com/2007/01/utf-8-with-hibernate-30-and-mysql/

+0

Merci mec, vous êtes un épargnant de vie! – ye9ane