我正在尝试从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及以下版本中才遇到此问题。有人有什么想法吗?
答案 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);