Re: Character Decoding Problems - Mailing list pgsql-jdbc
| From | Evan Tsue |
|---|---|
| Subject | Re: Character Decoding Problems |
| Date | |
| Msg-id | 17C3FC67-CD27-11D7-A787-000A95A08104@windsormgmt.com Whole thread Raw |
| In response to | Character Decoding Problems (Evan Tsue <evan@windsormgmt.com>) |
| List | pgsql-jdbc |
Barry,
Sure. I'm not certain what the best way to do this is, but if this is
not sufficient, then we can try something else. Here's the schema for
the table I created:
testdb=# \d messages Table "public.messages" Column | Type
|
Modifiers
--------------+------------------------
+------------------------------------------------------------------- message_uid | integer | not null
default
nextval('public.messages_message_uid_seq'::text) message_text | character varying(255) |
Indexes: messages_pkey primary key btree (message_uid)
I used this command to create that table:
CREATE TABLE messages (message_uid SERIAL PRIMARY KEY, message_text
VARCHAR(255));
The next thing I did from psql was this insert statement:
INSERT INTO messages (message_text) VALUES ('يرجى ادخال النص المراد
ترجمته');
I hope that the Arabic text I have in there comes out right for you.
If not, let me know.
So, if I do a SELECT * FROM messages; in psql, everything comes out
fine. Now, here's the Java code that I used to access this data:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class LanguageTest {
public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs =
null;
// Load the PostgreSQL driver. try { Class.forName("org.postgresql.Driver"); } catch
(ClassNotFoundExceptione) { System.err.println("Unable to find the PostgreSQL JDBC driver.");
System.exit(1); }
try { // Set the connection properties. Properties info = new Properties(); info.put("user",
"test"); info.put("password", "test");
// Create a new connection. conn = DriverManager.getConnection(
"jdbc:postgresql://127.0.0.1:5432/testdb", info);
// Prepare the SQL statement. ps = conn.prepareStatement("SELECT * FROM messages");
// Execute the query. rs = ps.executeQuery();
// Iterate through the results. if (rs.first()) { do { int messageId =
rs.getInt(1); String message = rs.getString(2); System.out.println(
"UID:" + messageId + " Message: " + message); } while (rs.next()); } } catch (SQLException ex) {
ex.printStackTrace(); } finally { // Close the connection. try { rs.close();
ps.close(); conn.close(); } catch (SQLException e1) { } }}
}
Let me know what you think.
Evan
On Tuesday, Aug 12, 2003, at 17:38 US/Eastern, Barry Lind wrote:
> Evan,
>
> Can you provide a test case to demonstrate your problem. Many people
> are using the driver sucessfully with non-english characters. So I
> don't think the problem is as you describe it.
>
> thanks,
> --Barry
>
> Evan Tsue wrote:
>> Hi,
>> I've been having problems decoding non-Latin characters using the
>> Postgres JDBC driver. Here's the situation: I'm using postgres
>> 7.3.2 and I've created a test database using 'createdb -E UNICODE
>> testdb' to ensure that I really am using the UNICODE character set.
>> Using psql, I created a table using the following command: 'CREATE
>> TABLE messages (message_uid SERIAL PRIMARY KEY, message_text
>> VARCHAR(255))' to test character encoding and decoding. At that
>> point, I inserted a message that was in English. I also inserted a
>> message that was in Arabic. I did a select on that table using psql
>> and the values came back perfectly (I'm using MacOS X, so the
>> characters are displayed correctly).
>> Next, I did a select on the same table via JDBC. All I had the
>> program do was select on the table and print the results out to
>> standard output. The message in English was displayed perfectly.
>> However, the message that was in Arabic was displayed as a series of
>> question marks and spaces.
>> I eventually navigated my way through the JDBC driver source to
>> find that the problem is in the decodeUTF8 method in the
>> org.postgresql.core.Encoding class. Apparently, it doesn't seem to
>> be working properly for non-Western characters. I replaced the call
>> to that method with a call to the java.lang.String constructor and
>> now everything works perfectly.
>> In addition to Arabic, I took a random sample of Chinese,
>> Japanese, Russian and Korean text and inserted it into the database.
>> Using the original driver, I get the question marks. But, when I
>> used the String constructor, everything comes out fine.
>> Could someone please either fix the Encoding.decodeUTF8 method or
>> replace the call to that with a call to the String constructor?
>> Thanks,
>> Evan
>> ---------------------------(end of
>> broadcast)---------------------------
>> TIP 8: explain analyze is your friend
>
pgsql-jdbc by date: