2

一部の名前がリトアニア語の文字で書かれているDBがありますが、Javaを使用してそれらを取得しようとすると、リトアニア語の文字が無視されます。

    DbConnection();
    zadanie=connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    sql="SELECT * FROM Clients;";   
    dane=zadanie.executeQuery(sql);

    String kas="Imonė";
    while(dane.next())
    {
         String var=dane.getString("Pavadinimas");       
         if (var!= null) {var =var.trim();} 
         String rus =dane.getString("Rusys");   
         System.out.println(kas+" "+rus);
    }

    void DbConnection() throws SQLException
    {
        String baza="jdbc:odbc:DatabaseDC"; 
        try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }catch(Exception e){System.out.println("Connection error");}
        connect=DriverManager.getConnection(baza);
    }

DBのフィールドのタイプはTEXT、サイズ20であり、追加の文字デコードなどを使用しないでください。

DBにはrusに等しい「Imonė」と書かれていますが、それは私に「ImonėImone」を与えます。

4

3 に答える 3

4

JDBC-ODBC Bridge が Java 8 から削除されたので、この特定の質問はますます歴史的な関心事の項目になりますが、記録のために:

JDBC-ODBC ブリッジは、コード ポイント U+00FF を超える Unicode 文字の Access ODBC ドライバー ("Jet" および "ACE") で正しく動作したことはありません。これは、Access がそのような文字を Unicode として格納しますが、UTF-8 エンコーディングを使用しないためです。代わりに、UTF-16LE の「圧縮された」バリエーションを使用します。コード ポイントが U+00FF 以下の文字は 1 バイトとして格納され、U+00FF を超える文字はヌル バイトとして格納され、その後に UTF-16LE バイト ペアが続きます。 (秒).

文字列 'Imonė' が Access データベース内に格納されているため、Access 自体に正しく表示される場合

accessEncoded.png

それは次のように保存されます

I  m  o  n  ė
-- -- -- -- --------
49 6D 6F 6E 00 17 01

('ė' は U+0117)。

JDBC-ODBC ブリッジは、Access ODBC ドライバーから受け取った最後の文字を理解していないため、返されるだけです。

Imon?

一方、文字列を UTF-8 エンコーディングで Access データベースに格納しようとすると、JDBC-ODBC ブリッジが文字列自体を挿入しようとした場合に発生します。

Statement s = con.createStatement();
s.executeUpdate("UPDATE vocabulary SET word='Imonė' WHERE ID=5");

文字列は次のように UTF-8 でエンコードされます。

I  m  o  n  ė
-- -- -- -- -----
49 6D 6F 6E C4 97

その後、Access ODBC ドライバーはそれをデータベースに次のように格納します。

I  m  o  n  Ä  —
-- -- -- -- -- ---------
49 6D 6F 6E C4 00 14 20
  • Windows-1252 では C4 は 'Ä' であり、これは U+00C4 であるため、そのまま格納されます。C4
  • 97 は、U+2014 である Windows-1252 の「em ダッシュ」であるため、次のように保存されます。00 14 20

これで、JDBC-ODBC ブリッジは問題なく取得できます (Access ODBC ドライバーC4 97が途中で文字を元に戻すため)。ただし、Access でデータベースを開くと、次のように表示されます。

ImonÄ—

utf8Encoded.png

JDBC-ODBC ブリッジ、Access データベースに対して完全なネイティブ Unicode サポートを提供したことはありません。JDBC 接続にさまざまなプロパティを追加しても問題は解決しません。

ODBC を使用しない Access データベースの完全な Unicode 文字サポートについては、代わりにUCanAccessの使用を検討してください。(詳細については、こちらの別の質問をご覧ください。)

于 2014-04-01T12:25:26.610 に答える
0

JDBC-ODBC ブリッジを使用しているため、接続の詳細で文字セットを指定できます

これを試して:

Properties prop = new java.util.Properties();
prop.put("charSet", "UTF-8");

String baza="jdbc:odbc:DatabaseDC"; 
connect=DriverManager.getConnection(baza, prop);
于 2011-08-28T17:57:27.367 に答える
0

UTF-8 の代わりにこの "Windows-1257" を使用してみてください。これはバルト地域用です。

java.util.Properties prop = new java.util.Properties();
prop.put("charSet", "Windows-1257");
于 2014-04-01T08:25:38.247 に答える