gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:17:31 25 4
gpt4 key购买 nike

我正在尝试从 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 及更低版本中遇到此问题。有人有任何想法吗?

最佳答案

这些麻烦的文件显然是使用非常版本的 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);

关于java - 从旧版 Access 数据库导出时,希腊字符显示为问号或方框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51514136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com