2

我有以下问题。java 结果集不显示 Unicode(中文)字符,而是显示所有其他字符。我确信所有字符都在 Microsoft SQL Server(作为 nvarchar)中正确存储/显示。

所以这似乎是一个检索问题。这是代码:

受保护的字符串 getStringValueNoNulls(ResultSet rs, String colName) {

        String ret = rs.getString(colName);

        ret = new String(ret.getBytes(), "UTF8");

        System.out.println(ret);

...打印语句的输出:

SO(数据库中的 SO)

???(DB中的张先生)

??????9999 (建国门外大街9999 in DB)

?? (北京在DB)

100010(数据库中的 100010)

它显示所有英文/ASCII字符,但不显示中文字符。我注意到中文字符的数量等于它替换的问号。

我之前尝试过简单的 getString(),现在做 getBytes() 进行转换,两者都产生相同的结果。

是我遗漏了什么,还是驱动程序有问题?请帮忙。

----------------我刚刚添加了这个作为我的连接,没有帮助:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

String connectionUrl = "jdbc:sqlserver://127.0.0.1:1433;database=myDB;user=myuser;password=myPass;useUn‌​icode=true;characterEncoding=UTF-8";

连接 con = DriverManager.getConnection(connectionUrl);

仍然为汉字得到相同的问号。

问候。

4

2 回答 2

1

好的,想出了解决方案。这是 Java 和 utf8 编码无法打印和写入的问题。

(不是驱动程序问题)首先,如果要输出(文件或控制台),则必须使用打印流:

输出到控制台:

String ret = rs.getString(colName);
PrintStream out = new PrintStream(System.out, false, "UTF8");  //This is the key
out.println(ret);

和一个文件:

private static void writeUtf8ToFile(File file, boolean append, String data)
    throws IOException {
  boolean skipBOM = append && file.isFile() && (file.length() > 0);
  Closer res = new Closer();
  try {
    OutputStream out = res.using(new FileOutputStream(file, append));
    Writer writer = res.using(new OutputStreamWriter(out, Charset.forName("UTF-8")));
    if (!skipBOM) {
      writer.write('\uFEFF');
    }
    writer.write(data);
  } finally {
    res.close();
  }
}
于 2013-08-27T12:18:15.207 回答
0

添加连接必须像

connection = riverManager.getConnection("jdbc:sqlserver://190.128.4.195;databaseName=unicodedemo;user=ab;password=ab@Admin;useUnicode=true;characterEncoding=UTF-8");

于 2013-08-23T15:01:15.897 回答