从旧的Access数据库导出时,希腊字符显示为问号或框

时间:2018-07-25 08:22:42

标签: java jdbc character-encoding character ucanaccess

我正在尝试从Access数据库中导出数据,并将其另存为ascii格式的文本文件。我正在使用UCanAccess JDBC驱动程序,当我在文件中写入希腊字符时,它们显示为问号或类似这个:

显示的框而不是希腊字符:

显示的框而不是希腊字符2:

这是我要与数据库连接的代码:

Properties props = new Properties();
props.put("charSet","UTF-8");

conn = DriverManager.getConnection("jdbc:ucanaccess://" + path, props);

dbConnectionData = conn.getMetaData();
dbResultSet = dbConnectionData.getTables(null, null, "%", null);

s =  conn.createStatement();

int i = 0;

while(dbResultSet.next()){
    numberOfTables++; 
}

dbResultSet = dbConnectionData.getTables(null, null, "%", null);
fileNames = new String[numberOfTables];

while(dbResultSet.next()){
    fileNames[i] = dbResultSet.getString(3);
    i++;
}

这是我执行查询以提取所需数据的代码:

DatabaseTable dbTab;

File file;
File dir;

FileOutputStream out;
Writer writer;

ResultSet rsSet;
ResultSetMetaData metaData;

int space;
int numberOfDash = -1;
int dashInLine = 0;
int startOfFile = 0;
int endOfFile;

int colsMax[];

try{
    int i = 0;

    dir = new File(path + "\\" + "Ascii-" + db.name);

    if(!dir.exists()){
        dir.mkdir();
    }

    file = new File(path + "\\" + dir.getName() + "\\" + db.fileNames[fileNumber] + ".txt");

    out = new FileOutputStream(file);
    writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);

    dbTab = new DatabaseTable(db);

    for(i = 0; i < fileNumber; i++){
        rsSet = db.s.executeQuery("SELECT * FROM [" + db.fileNames[i] + "]");
        metaData = rsSet.getMetaData();
        startOfFile += metaData.getColumnCount();
    }

    rsSet = db.s.executeQuery("SELECT * FROM [" + db.fileNames[fileNumber] + "]");
    metaData = rsSet.getMetaData();

    endOfFile = startOfFile + metaData.getColumnCount();

然后我正在使用编写器将数据写入文件中。

当我导入使用Access 2007或更高版本的Access创建的Access数据库时,它可以正常工作。我仅在2003及以下版本中才遇到此问题。有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

显然,麻烦的文件是使用非常的旧版Access创建的,该版本使用当前Windows代码页保存了文本字段。 (较新版本的Access将文本字段另存为Unicode。)在您的情况下,使用的代码页为Windows-1253

要从这些旧文件中读取希腊文本,您可以通过在项目中创建一个新类Windows1253Opener.java来告诉UCanAccess将文本字段解码为Windows-1253 ...

package com.example.ucanaccessdemo;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

import com.healthmarketscience.jackcess.Database;
import com.healthmarketscience.jackcess.DatabaseBuilder;

import net.ucanaccess.jdbc.JackcessOpenerInterface;

public class Windows1253Opener implements JackcessOpenerInterface {
    public Database open(File fl, String pwd) throws IOException {
        DatabaseBuilder dbd = new DatabaseBuilder(fl);
        dbd.setAutoSync(false);
        dbd.setCharset(Charset.forName("cp1253"));
        return dbd.open();
    }
}

...,并将;jackcessOpener=com.example.ucanaccessdemo.Windows1253Opener附加到您的连接网址,例如

String connStr = "jdbc:ucanaccess://" + dbFileSpec 
        + ";jackcessOpener=com.example.ucanaccessdemo.Windows1253Opener";
Connection conn = DriverManager.getConnection(connStr);