Janne,
Really??? A filter just to set character encoding??? Although I
imagine it would work isn't that a little sledge hammer-ish ;-)
Why not just put the following at the top of each of your JSPs (or tweak
as necessary):
<%@ page language="java" pageEncoding="UTF-8"
contentType="text/html;charset=UTF-8" %>
That will ensure your web page supports UTF-8.
As far as Stripes is concerned you don't have to do anything for it to
support UTF-8... and Java retains all Strings in unicode so no issue
there either.
That leaves your MySQL database... and here I have found that I have
done multiple things and I'm sure I could trim this down but after
spending days on particular issues I just got fed up and set everything
I need to that I know will ensure things stay UTF-8... so be forewarned
this list should be able to be slimmed down and if you have the time to
test multiple scenarios then power to you ;-)
MySQL configuration (UTF-8 relevant pieces only...):
[mysqld]
skip-character-set-client-handshake
character-set-server=utf8
collation-server=utf8_general_ci
character_set_results=utf8
Starting MySQL (UTF-8 relevant pieces only...):
./bin/mysqld_safe --user=mysql --character-set-server=utf8
--collation-server=utf8_general_ci &
And last but not least instead of trying to set the connection to UTF-8
we simply create a sub-classed dialect and set the table type AND
dialect in our Persistence.xml (we use JPA) as we really don't use
anything but InnoDB and UTF-8 in our databases:
public class UTF8MySQL5InnoDBDialect extends MySQL5InnoDBDialect {
public UTF8MySQL5InnoDBDialect() {
super();
}
public final String getTableTypeString() {
return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
}
}
Oh... and as a last warning if you are using an xterm then you'll be
able to see the characters in your DB properly but if you set the
encoding to UTF-8 (from its ASCII default) your going to see only
Latin-1 characters i.e. the spanish n is shown but not other non-Latin-1
characters. Screwy I know but caused a lot of grief.
So you have many suggestions... and feel free to pull the pieces from
other people's solutions that resonate better with you... but UTF-8
isn't really a Stripes problem per se because Java's unicode support
really makes localization within the webapp transparent... .
--Nikolaos
Janne Jalkanen wrote:
Simple solution: declare the accept-charset value on all your forms to be "UTF-8" (and *only*
UTF-8), then put up a simple Filter in front of your chain which says
"request.setCharacterEncoding("UTF-8"). This should ensure that you get full unicodes to
the ActionBean, and then you only have to deal with your DB encodings.
Works for me well.
/Janne
On 4 Feb 2011, at 22:45, Daniil Sosonkin wrote:
Hi there,
So I'm sure there's someone out there who has met this problem and has found a
solution, therefore, let me ask the source. We are dealing with an
international web platform - many many languages. People submit forms in
different languages and it all stored in a mySQL database. Basically, I'm
having troubles getting UTF8 to work with said database. I have troubles at all
levels - stripes and database.
Here's my set up:
- mySQL 5.1
- mysql-jdbc 5.1 (driver)
- tables - utf8
- LocalePicker is always forcing charset to UTF-8 in stripes
Here's the problem:
- User enters some characters into the form (chinese, russian, hebrew....)
- ActionBean sticks it into the database and sends email.
- Fields are declared as Strings and nothing is done to the values
- When sticking to the database it will contain - ???? as values
- The output from the database obviously doesn't work
- When printing submitted value on page from ${actionBean.field} it displays
junk
I know that browsers send all forms to the servers in ISO-8859-1 encoding. In the good old days, or
with plain servlets, I would always have to convert submitted values to UTF-8 with the following:
new String(rs.getString(1).getBytes("ISO-8859-1"), "UTF-8"); From then on the
value is in UTF-8
In Stripes, I think that the values come to ActionBeans in ISO-8859-1 since
StringTypeConverter doesn't do anything. That's fine, I wrote my own converter
for UTF using the logic from above. This solves the problem with printing
submitted value on the page ${actionBean.field}; but if the value is still
displayed in the form it is all grumbled as if it was ISO-8859-1 representation
of UTF-8. That I don't understand.
As for storing UTF8 into mySQL - well, if someone can help me out it would be
great since I can't get UTF8 string stored in the database without doing the
UTF8 to ISO-8859-1 and back conversion while keeping tables at latin1 I would
really appreciate it. The main question is Stripes.
I hope this whole rambling makes sense and someone has had this problem
previously. Hopefully there was a solution.
Sincerely,
Daniil
<daniil.vcf>------------------------------------------------------------------------------
The modern datacenter depends on network connectivity to access resources
and provide services. The best practices for maximizing a physical server's
connectivity to a physical network are well understood - see how these
rules translate into the virtual world?
http://p.sf.net/sfu/oracle-sfdevnlfb_______________________________________________
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users
------------------------------------------------------------------------------
The modern datacenter depends on network connectivity to access resources
and provide services. The best practices for maximizing a physical server's
connectivity to a physical network are well understood - see how these
rules translate into the virtual world?
http://p.sf.net/sfu/oracle-sfdevnlfb
_______________________________________________
Stripes-users mailing list
Stripes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/stripes-users