从旧的 Access 数据库导出时,希腊字符显示为问号或方框
Posted
技术标签:
【中文标题】从旧的 Access 数据库导出时,希腊字符显示为问号或方框【英文标题】:Greek characters show as question marks or boxes when exporting from an old Access database 【发布时间】:2018-07-25 08:22:41 【问题描述】:我正在尝试从 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 数据库时,它可以完美运行。我只有 2003 及以下版本才有这个问题。有人有什么想法吗?
【问题讨论】:
This 是一个 Access_2000 .mdb 文件,其中包含一个包含希腊字符的表。当您在其上运行代码时,它会重现问题吗? 不,它没有。这是给我的输出:!Image 好的,所以听起来这不是数据库文件格式的功能本身,这是您使用的旧文件在文本字段。您能否提供一个可用于重现问题的小型示例数据库的下载链接? here 是下载示例数据库的链接。 【参考方案1】:这些麻烦的文件显然是使用 非常 旧版本的 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
附加到您的连接 URL,例如,
String connStr = "jdbc:ucanaccess://" + dbFileSpec
+ ";jackcessOpener=com.example.ucanaccessdemo.Windows1253Opener";
Connection conn = DriverManager.getConnection(connStr);
【讨论】:
以上是关于从旧的 Access 数据库导出时,希腊字符显示为问号或方框的主要内容,如果未能解决你的问题,请参考以下文章
尝试从 MS Access DB 检索字段值时,Java 中的希腊词作为问号 [重复]