Re: character encoding problems

Daniel Kirk <[email protected]> Tue, 22 May 2007 21:11:17 +1000
Newsgroups gmane.comp.db.mysql.java
Message-ID <[email protected]>
Hi Ronald,

Thanks for your email.  I guess I'm on a hiding to nothing because of 
your first point:
Is the remote side sending you correct UTF-8?

The data can come from over 100 different sources, and to expect them 
all to encode using UTF-8 is forlorn.  I thought that by setting my 
reader to use UTF-8 encoding that it would be read in UTF-8 format - but 
from what you're saying that's not the case if it's not actually sent in 
UTF-8 format.  Is that right?  If I can find out what encoding they're 
using, is it possible to covert it to UTF-8?

regards

Daniel Kirk
Managing Editor
-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
web:  http://www.sportspunter.com
      http://www.toptipper.com
      http://www.pickswarehouse.com
email : [email protected]
phone : +61(0)410 409 237
fax : +61(0)2 66462847
Internet Digital Media Australia
ABN : 51275059681
-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- 



Ronald Klop wrote:

> On Tue May 22 06:35:21 CEST 2007 Daniel Kirk <[email protected]> 
> wrote:
>
>     Hi There,
>
>     I'm having troubles trying to convert 'everything' to UTF-8 format.
>
>     I'm using the db drivers from /mysql-connector-java-3.1.11-bin.jar
>     connected to a version 5.0.27 database on a linux platform.
>
>     I get a lot of data containing characters in multiple languages eg
>     Swedish (as below), Norwegian, Greek etc
>
>     Firstly, I have robots downloading data off the 'net. They should be
>     using UTF-8 encoding:
>     br = new BufferedReader(new InputStreamReader(is,
>     "UTF-8"));
>
>     The robots then put some names of sports teams in a db, and they
>     seemed
>     to be stored as you'd hope:
>     mysql> select * from MissingTeams where competitionid = 336;
>     +----------------------+---------------+-------------+
>     | team | competitionid | bookmakerid |
>     +----------------------+---------------+-------------+
>     | B?linge | 336 | 54 |
>     | Sunnan? SK | 336 | 54 |
>     | KIF ?rebro DFF | 336 | 54 |
>     | Kopparbergs/G?teborg | 336 | 54 |
>     | Falk?pings KIK | 336 | 54 |
>     | LdB FC Malm? | 336 | 54 |
>     | Ume? IK | 336 | 54 |
>     | Link?pings FC | 336 | 54 |
>     +----------------------+---------------+-------------+
>
>
>     But when I read this in through a result set, the encoding problem
>     kicks in:
>
>     I'm just using a simple system.out.println:
>     while(rs.next()) {
>     String team = rs.getString(1);
>     if (competitionid == 336) System.out.println("alias is :
>     " + team);
>
>     Which produced output like:
>
>     alias is : B???linge
>     alias is : Falk???pings KIK
>
>     So I tried connecting using this as part of the query string:
>     &characterEncoding=UTF-8
>
>     Which did not have any effect at all.
>
>     So I tried setting all the character set variables before my query.
>
>     Databases.executeUpdate("set character set 'utf8'", con);
>     Databases.executeUpdate("set character_set_connection =
>     'utf8'", con);
>     Databases.executeUpdate("set character_set_database =
>     'utf8'", con);
>     Databases.executeUpdate("set character_set_server = 'utf8'",
>     con);
>
>     And the output from my query changed, but still not right:
>     alias is : B??linge
>     alias is : Falk??pings KIK
>
>     So what I did next was change the character set variables where I add
>     the data into the "Missing Teams" table as above - so that its
>     Connection also used 'UTF-8'.
>
>     The result was that the characters were converted into a ? into
>     the db:
>
>     mysql> select * from MissingTeams where competitionid = 336;
>     +----------------------+---------------+-------------+
>     | team | competitionid | bookmakerid |
>     +----------------------+---------------+-------------+
>     | B?linge | 336 | 54 |
>     | Sunnan? SK | 336 | 54 |
>     | KIF ?rebro DFF | 336 | 54 |
>     | Kopparbergs/G?teborg | 336 | 54 |
>     | Falk?pings KIK | 336 | 54 |
>     | LdB FC Malm? | 336 | 54 |
>     | Ume? IK | 336 | 54 |
>     | Link?pings FC | 336 | 54 |
>     +----------------------+---------------+-------------+
>
>     Does anyone have any suggestions how I can write the data to the db
>     using the correct encoding, and read it back out also using the
>     correct
>     encoding?
>
>     thanks
>
>     -- 
>     Daniel Kirk
>     Managing Editor
>     -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
>     web: http://www.sportspunter.com
>     http://www.toptipper.com
>     http://www.pickswarehouse.com
>     email : [email protected]
>     phone : +61(0)410 409 237
>     fax : +61(0)2 66462847
>     Internet Digital Media Australia
>     ABN : 51275059681
>     -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
>
>
>     -- 
>     MySQL Java Mailing List
>     For list archives: http://lists.mysql.com/java
>     To unsubscribe:
>     http://lists.mysql.com/[email protected]
>
> There are a lot of places where this can go wrong.
> Check on every boundary between systems if the charset is handled 
> correctly.
>
> - Is the remote side sending you correct UTF-8?
> - Is the data correct in the database? Send your 'SHOW VARIABLES' and 
> 'SHOW CREATE TABLE ...'.
> - When you read data from the database is it correct?
> - Does your System.out.println() print the data correct. (if you have 
> unix, does your xterm understand UTF-8?)
>
> In stead of printing the String you can print the values of the bytes 
> of String.getBytes("UTF-8"). So you are sure, the byte codes are correct.
>
> Ronald.


-- 
MySQL Java Mailing List
For list archives: http://lists.mysql.com/java
To unsubscribe:    http://lists.mysql.com/[email protected]