从旧的 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 中的希腊词作为问号 [重复]

将我们自己的 OAuth 2 代码从旧的人员 API 转换为新的人员 API

计算新的经度,从旧的纬度+ n米

从旧的 html dom 元素创建 json

R:导出txt或csv表,其中包含utf编码的希腊字符

在 MS-Access 中,当外键不再存在时,如何在组合框中显示旧的外键?