konertowanie Stringa z windows-1250 na utf-8

0

Witam!

Kolejne pytanie od początkującego fana Javy ;-)

W ramach ćwiczeń napisałem sobie prosty programik w Javie do przenoszenia danych z bazy MS SQL do MySQL. Działa. Ale jedna rzecz mnie zaskoczyła: dane w MS SQL'u są zakodowane w windows-1250 a docelowa baza MySQL jest zakodowana w utf-8. W skrypcie PHP, który przenosił te dane musiałem konwertować dane przy pomocy funkcji iconv() a Java po prostu przeniosła mi te dane (nie konwertowałem ich) i są OK - polskie znaki się nie wywaliły (a przecież powinny). Poniżej podaję kod, aby było wiadomo o czym rozmawiamy.

I tu dwa pytania:
1> jakim cudem zostało to przeniesione poprawnie pomimo, że nie użyłem żadnej funkcji konwertującej? czy może jest po prostu tak, że connector do MS SQLa sam wykrywa kodowanie, a connector MySQL ma wskazane, że ma używać UTF-8 i w związku z tym dane są konwertowane?
2> gdyby zaszła potrzeba konwertowania (np. w innym skrypcie) - czy jest w Javie odpowiednik funkcji iconv()?

import java.sql.*;

public class sqlReplica {

    public static void main (String[] args)
    {
        Connection mssql = null;
        String msuser = "sa";
        String mspass = "haslo";
        String msurl = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=CDN_Optima2005";

        Connection mysql = null;
        String myuser = "root";
        String mypass = "haslo";
        String myurl = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";

        try
        {
            Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
            mssql = DriverManager.getConnection (msurl, msuser, mspass);

            Class.forName("com.mysql.jdbc.Driver").newInstance();
            mysql = DriverManager.getConnection (myurl, myuser, mypass);

            System.out.println ("Połączenie z bazami nawiązane");
        }
        catch (Exception e)
        {
            System.err.println ("Nie mogę się połączyć z bazą: " + e);
        }
        
        try
        {
        	String msQuery = "SELECT Twr_TwrId, Twr_Kod, Twr_Nazwa, Twr_Grupa, Twr_Kategoria, Twr_JM, " + 
        	"Twr_Masa, Twr_TwCNumer, Twr_Stawka, CONVERT(VARCHAR(19), Twr_TS_Mod, 120) AS Twr_TS_Mod, " +
        	"Twr_NieAktywny, TwC_Wartosc, TwC_Waluta, Twc_Typ FROM CDN.Towary, CDN.TwrCeny WHERE " +
        	"Twr_TwrId = Twc_TwrId AND Twr_TwCNumer = TwC_TwCNumer ORDER BY Twr_TwrId ASC";
        	Statement msStmt = mssql.createStatement();
        	ResultSet msrs = msStmt.executeQuery(msQuery);
        	
        	while (msrs.next()) {
        		String Twr_TwrId = msrs.getString("Twr_TwrId");
        		String Twr_Kod = msrs.getString("Twr_Kod"); 
        		String Twr_Nazwa = msrs.getString("Twr_Nazwa");
        		String Twr_Opis = "Lorem ipsum dolor sit amet.";
        		String Twr_Grupa = msrs.getString("Twr_Grupa");
        		String Twr_SWW = "123456";
        		String Twr_EAN = "123456";
        		String Twr_URL = "http://www.scyzoryk.pl/"; 
        		String Twr_JM = msrs.getString("Twr_JM");
        		String Twr_Masa = msrs.getString("Twr_Masa");
        		String Twr_TwCNumer = msrs.getString("Twr_TwCNumer"); 
        		String Twr_Stawka = msrs.getString("Twr_Stawka");
        		String Twr_TS_Mod = msrs.getString("Twr_TS_Mod");
        		String Twr_NieAktywny = msrs.getString("Twr_NieAktywny"); 
        		String TwC_Wartosc = msrs.getString("TwC_Wartosc");
        		String TwC_Waluta = msrs.getString("TwC_Waluta");
        		String Twc_Typ = msrs.getString("Twc_Typ");
        		String Twr_Magazyn = "1200";

                try
                {
                	PreparedStatement myStmt = 
                	mysql.prepareStatement(
                	"INSERT INTO `towary` (`id_cdn`, `nazwa`, `opis`, `kod`, `sww`, `ean`, `grupa`, "+
                	"`jm`, `masa`, `cena_detal`, `cena_hurt`, `cena_promo`, `vat`, `waluta`, `magazyn`, "+
                	"`url`, `data_mod_ins`, `data_mod_upd`, `data_mod_ewar`, `data_mod_cdn`, `status`) "+
                	"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
                	myStmt.setString(1, Twr_TwrId);
                	myStmt.setString(2, Twr_Nazwa);
                	myStmt.setString(3, Twr_Opis);
                	myStmt.setString(4, Twr_Kod);
                	myStmt.setString(5, Twr_SWW);
                	myStmt.setString(6, Twr_EAN);
                	myStmt.setString(7, Twr_Grupa);
                	myStmt.setString(8, Twr_JM);
                	myStmt.setString(9, Twr_Masa);
                	myStmt.setString(10, TwC_Wartosc);
                	myStmt.setString(11, TwC_Wartosc);
                	myStmt.setString(12, TwC_Wartosc);
                	myStmt.setString(13, Twr_Stawka);
                	myStmt.setString(14, TwC_Waluta);
                	myStmt.setString(15, Twr_Magazyn);
                	myStmt.setString(16, Twr_URL);
                	myStmt.setString(17, Twr_TS_Mod);
                	myStmt.setString(18, Twr_TS_Mod);
                	myStmt.setString(19, Twr_TS_Mod);
                	myStmt.setString(20, Twr_TS_Mod);
                	myStmt.setString(21, Twr_NieAktywny);
                	myStmt.executeUpdate();       		
                }
                catch (Exception e)
                {
                    System.err.println ("Nie mogę wykonać zapytania: " +  ". "+ e);
                }
      		
        	}
        	
        }
        catch (Exception e)
        {
            System.err.println ("Nie mogę wykonać zapytania. "+ e);
        }


        finally
        {
            if (mssql != null) // (mysql != null)
            {
                try
                {
                    mssql.close();
                    mysql.close();
                    System.out.println("Połączenia z bazami zakończone");
                }
                catch (Exception e) {
                	System.err.println ("Błąd: " + e);
                }
            }
        }
    }
}
0

Ad 1) najprawdopodobniej tak
Ad 2) "alamakota".getBytes("UTF-8");

pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1