我用java语言写了连接远端MsSqlServer数据库的程序,使用MS提供的jdbc,在本地机器winxp+jdk1.4.2下运行显示都一切正常。但是把该程序放到一台Unix机器(Irix6.5,jdk1.4.1_06),重新javac后,在显示数据库的中文数据时,总是以问号“?”代替汉字。该程序如下:
============================================================
import java.sql.*;public class CreateTable {
        public static void main(String args[]) {
                Connection con = null;
                try {
                        Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
                        System.out.println("JDBC driver loaded");
                        con = DriverManager.getConnection("jdbc:microsoft:sqlserver://netsv1:1433;DatabaseName=aaaa","sa","12345");
                        System.out.println("Dabase connection established");
                        Statement stmt = con.createStatement();
                        ResultSet rs = stmt.executeQuery( "select * from Author" );
                        while (rs.next())
                                {
                                        System.out.println(rs.getString("Author_ID") + "\t" +
                                                                rs.getString("Author_Name"));
                                }
                        stmt.close();
                }
                catch(ClassNotFoundException cnfe) {
                        System.out.println("ClassNotFoundException: Could not locate driver");
                }
                catch(SQLException cnfe) {
                        System.out.println("SQLException: " +cnfe);
                }
                catch(Exception e) {
                        System.out.println("An unknown error occurred while connecting to the database");
                }
                finally {
                        try {
                                if ( con != null)
                                con.close();
                        } catch(SQLException sqle) {
                                System.out.println("Unable to close database connection.");
                        }
                }
        }
}
===============================================
然后我想是否是JVM的编码有问题,于是又写了个简短的程序:
public class Hello {
        public static void main(String args[]) {
                System.out.print("Hello,世界你好!");
        }
}
在Unix机器上编译后,执行java Hello,结果显示的汉字“世界你好”,显示正常。这是不是说明JVM的编码是正确的。但是为什么从SqlServer数据库中取出的数据总是显示为问号呢?

解决方案 »

  1.   

    重新构造取过来的字符串String Author_ID = new String(rs.getString("Author_ID").getBytes("ISO8859_1"));
    试试这样行不行
      

  2.   

    楼上的方法应该可以的
    在其他地方看到过直接一句命令setEncoding("GBK")
      

  3.   

    to: gaopeng123(鹏鹏) 
    试了"String Author_ID = new String(rs.getString("Author_ID").getBytes("ISO8859_1"));
    "也不行,也不知道什么地方出问题?
      

  4.   

    我用一个Env.java查看一下系统和JVM信息,请高手看一下问题出在什么地方.
    /*
     * Copyright (c) 2002 [email protected]
     * $Id: Env.java,v 1.1 2002/07/30 09:48:12 chedong Exp $
     */import java.util.*;
    import java.text.*;/**
     * 目的:
     *     显示环境变量和JVM的缺省属性
     * 输入:无
     * 输出:
     *     1 支持的LOCALE
     *     2 JVM的缺省属性
     */public class Env {
        /**
         *  main entrance
         */
        public static void main(String[] args) {
        
            System.out.println("Hello, it's: " +  new Date());        //print available locales
            Locale list[] = DateFormat.getAvailableLocales();
            System.out.println("======System available locales:======== ";
            for (int i = 0; i < list.length; i++) {
                System.out.println(list[i].toString() + "\t" + list[i].getDisplayName());
            }        //print JVM default properties
            System.out.println("======System property======== ";
            System.getProperties().list(System.out);
        }
    }
    ==============================================
    输出结果如下:
    Hello, it's: Fri Apr 22 09:18:20 GMT 2005
    ======System available locales:======== 
    ar Arabic
    ar_AE Arabic (United Arab Emirates)
    ar_BH Arabic (Bahrain)
    ar_DZ Arabic (Algeria)
    ar_EG Arabic (Egypt)
    ar_IQ Arabic (Iraq)
    ar_JO Arabic (Jordan)
    ar_KW Arabic (Kuwait)
    ar_LB Arabic (Lebanon)
    ar_LY Arabic (Libya)
    ar_MA Arabic (Morocco)
    ar_OM Arabic (Oman)
    ar_QA Arabic (Qatar)
    ar_SA Arabic (Saudi Arabia)
    ar_SD Arabic (Sudan)
    ar_SY Arabic (Syria)
    ar_TN Arabic (Tunisia)
    ar_YE Arabic (Yemen)
    be Byelorussian
    be_BY Byelorussian (Belarus)
    bg Bulgarian
    bg_BG Bulgarian (Bulgaria)
    ca Catalan
    ca_ES Catalan (Spain)
    cs Czech
    cs_CZ Czech (Czech Republic)
    da Danish
    da_DK Danish (Den)
    de German
    de_AT German (Austria)
    de_CH German (Switzerland)
    de_DE German (Germany)
    de_LU German (Luxembourg)
    el Greek
    el_GR Greek (Greece)
    en_AU English (Australia)
    en_CA English (Canada)
    en_GB English (United Kingdom)
    en_IE English (Ireland)
    en_IN English (India)
    en_NZ English (New Zealand)
    en_ZA English (South Africa)
    es Spanish
    es_BO Spanish (Bolivia)
    es_AR Spanish (Argentina)
    es_CL Spanish (Chile)
    es_CO Spanish (Colombia)
    es_CR Spanish (Costa Rica)
    es_DO Spanish (Dominican Republic)
    es_EC Spanish (Ecuador)
    es_ES Spanish (Spain)
    es_GT Spanish (Guatemala)
    es_HN Spanish (Honduras)
    es_MX Spanish (Mexico)
    es_NI Spanish (Nicaragua)
    es_PA Spanish (Panama)
    es_PE Spanish (Peru)
    es_PR Spanish (Puerto Rico)
    es_PY Spanish (Paraguay)
    es_SV Spanish (El Salvador)
    es_UY Spanish (Uruguay)
    es_VE Spanish (Venezuela)
    et Estonian
    et_EE Estonian (Estonia)
    fi Finnish
    fi_FI Finnish (Finland)
    fr French
    fr_BE French (Belgium)
    fr_CA French (Canada)
    fr_CH French (Switzerland)
    fr_FR French (France)
    fr_LU French (Luxembourg)
    hr Croatian
    hi_IN Hindi (India)
    hr_HR Croatian (Croatia)
    hu Hungarian
    hu_HU Hungarian (Hungary)
    is Icelandic
    is_IS Icelandic (Iceland)
    it Italian
    it_CH Italian (Switzerland)
    it_IT Italian (Italy)
    iw Hebrew
    iw_IL Hebrew (Israel)
    ja Japanese
    ja_JP Japanese (Japan)
    ko Korean
    ko_KR Korean (South Korea)
    lt Lithuanian
    lt_LT Lithuanian (Lithuania)
    lv Latvian (Lettish)
    lv_LV Latvian (Lettish) (Latvia)
    mk Macedonian
    mk_MK Macedonian (Macedonia)
    nl Dutch
    nl_BE Dutch (Belgium)
    nl_NL Dutch (Netherlands)
    no Norwegian
    no_NO Norwegian (Norway)
    no_NO_NY Norwegian (Norway,Nynorsk)
    pl Polish
    pl_PL Polish (Poland)
    pt Portuguese
    pt_BR Portuguese (Brazil)
    pt_PT Portuguese (Portugal)
    ro Romanian
    ro_RO Romanian (Romania)
    ru Russian
    ru_RU Russian (Russia)
    sh Serbo-Croatian
    sh_YU Serbo-Croatian (Yugoslavia)
    sk Slovak
    sk_SK Slovak (Slovakia)
    sl Slovenian
    sl_SI Slovenian (Slovenia)
    sq Albanian
    sq_AL Albanian (Albania)
    sr Serbian
    sr_YU Serbian (Yugoslavia)
    sv Swedish
    sv_SE Swedish (Sweden)
    th Thai
    th_TH Thai (Thailand)
    th_TH_TH Thai (Thailand,TH)
    tr Turkish
    tr_TR Turkish (Turkey)
    uk Ukrainian
    uk_UA Ukrainian (Ukraine)
    zh Chinese
    zh_CN Chinese (China)
    zh_HK Chinese (Hong Kong)
    zh_TW Chinese (Taiwan)
    en English
    en_US English (United States)
    ======System property======== 
    -- listing properties --
    java.runtime.name=Java(TM) 2 Runtime Environment, Stand...
    sun.boot.library.path=/usr/java2/lib32/sgi
    java.vm.version=1.4.1_06
    java.vm.vendor="Silicon Graphics, Inc."
    java.vendor.url=http://www.sgi.com/
    path.separator=:
    java.vm.name=Java HotSpot(TM) Client VM
    file.encoding.pkg=sun.io
    sun.os.patch.level=unknown
    java.vm.specification.name=Java Virtual Machine Specification
    user.dir=/sp/tmp
    java.runtime.version=1.4.1_06
    java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment
    os.arch=mips
    java.io.tmpdir=/var/tmp/
    line.separator=java.vm.specification.vendor=Sun Microsystems Inc.
    os.name=Irix
    sun.java2d.fontpath=
    java.library.path=/usr/java2/lib32/sgi/client:/usr/java...
    java.specification.name=Java Platform API Specification
    java.class.version=48.0
    java.util.prefs.PreferencesFactory=java.util.prefs.FileSystemPreferences...
    os.version=6.5
    user.home=/
    user.timezone=GMT
    java.awt.printerjob=sun.print.PSPrinterJob
    file.encoding=ISO8859-1
    java.specification.version=1.4
    user.name=root
    java.class.path=/usr/local/tomcat/common/lib/servlet....
    java.vm.specification.version=1.0
    sun.arch.data.model=32
    sun.java.command=Env
    java.home=/usr/java2
    java.specification.vendor=Sun Microsystems Inc.
    user.language=en
    java.vm.info=mixed mode
    java.version=1.4.1_06
    java.ext.dirs=/usr/java2/lib/ext
    sun.boot.class.path=/usr/java2/lib/rt.jar:/usr/java2/lib/...
    java.vendor=Silicon Graphics Inc.
    file.separator=/
    java.vendor.url.bug=http://www.sgi.com/developers/devtool...
    sun.cpu.endian=big
    sun.io.unicode.encoding=UnicodeBig
    sun.cpu.isalist=
      

  5.   

    推荐一篇文章:
    http://blog.csdn.net/ablo_zhou/archive/2004/07/27/53341.aspx
      

  6.   

    看看下面的第二节,或许对你有帮助:
    http://www.blueidea.com/tech/program/2004/1810_2.asp
      

  7.   

    SQL SERVER 2000 里用的ISO-8859-1 而你要从数据库中取出来的数据你用的编码是GB2312或者GBK 因为编码原理不一样,你取出来的当然是???
    具体解决方法网上有n多种,你自己选择一种解决方法。