使用 iso-8859-1 在 wildfly 中打开 ucanaccess/jackcess 数据库

Posted

技术标签:

【中文标题】使用 iso-8859-1 在 wildfly 中打开 ucanaccess/jackcess 数据库【英文标题】:Open ucanaccess/jackcess database in wildfly using iso-8859-1 【发布时间】:2016-02-09 08:03:00 【问题描述】:

我连接到 Wildfly 9.0.2 中定义的 MS Access 2000 数据库。工作正常。使用命令行 UCanAccess,我使用 -Dfile.encoding=ISO-8859 运行它,以便在 Ubuntu 上正确显示国家字符(挪威语)。在 OS X 上,命令行正确显示国家字符,无需任何 jre 选项。然而,Wildlfy 实例也在 OS X 上运行,并且不能正确显示国家字符(目前它们只是在一个简单的测试中写入控制台)在任何基于 java 的 sql 客户端(如 DBeaver 或 SQLSquirrel)中使用 UcanAccess-driver “正常工作“说到字符集。但是,通过 JPA 和 wildfly 查询数据库,国家字符被替换为“?”。

所以,有一种方法可以在 jdbc-url 上为 Jackcess 指定一个实用的“opener”:

......mdb;jackcessOpener=ucaextension.JackcessWithCharsetISO88591Opener

“开瓶器”如下所示:

public class JackcessWithCharsetISO88591Opener implements JackcessOpenerInterface 
    public Database open(File f, String pwd) throws IOException 
        DatabaseBuilder db = new DatabaseBuilder(f);
        db.setCharset(Charset.forName("ISO-8859-1"));
        try 
            db.setReadOnly(false);
            return db.open();
         catch (IOException e) 
            db.setReadOnly(true);
            return db.open();
        
    

(是的,异常处理至少应该发出警告。)

所以我将它打包为一个 jar 文件(maven),删除了 wildfly 中的旧连接、驱动程序和模块定义。然后我添加了这个 jar 文件以及 ucanaccess 模块的其他文件(ucanaccess 本身、hsqldb 等),重新创建了驱动程序和连接,现在使用 opener 参数,并使用它重新部署了战争。但是wildfly抱怨:

Caused by: java.lang.ClassNotFoundException: ucaextension.JackcessWithCharsetISO88591Opener from [Module "com.ucanaccess:main" from local module loader @1060b431 (finder: local module finder @612679d6 (roots: /Users/jonmartinsolaas/Local/wildfly-9.0.2.Final/modules,/Users/jonmartinsolaas/Local/wildfly-9.0.2.Final/modules/system/layers/base))]

很明显,url 参数已被拾取,但未找到该类,即使它与驱动程序的其他 jar 一起部署。该类实际上在 jar 文件中。但是我需要从其他 jars 中的任何其他 MANIFEST.INF 类路径中引用它吗?

【问题讨论】:

实际上没有必要将 ISO-8859-1 指定为字符集。多年来,Access 一直将文本存储为 Unicode。如果您在 Access 本身中打开数据库,文本是否正确显示?如果是这样,它是什么版本的 Access? 这是 Access 2000,字符在 Access 中显示正确,在 Ubuntu 上使用 jvm-option -Dfile.encoding=ISO-8859 运行的 UCanAccess 命令行中显示正确。在 OS X 上,不需要 UCanAccess 命令行的这个选项。我现在使用的 Wildfly 实例在 OS X 上运行,并且不能正确显示国家字符。 “Wildlfy 实例也在 OS X 上运行,并且不能正确显示国家字符(目前它们只是在一个简单的测试中写入控制台)” - 也许OS X 控制台只是通过将一些 Unicode 字符显示为? 来误导您。我已经看到 Windows 命令提示符这样做了。如果是这种情况,那么您应该将文本检索为 Unicode,并确保您的应用程序可以正确处理 Unicode 字符。 @Gord,是的,正确地测试它,例如。在我的应用程序的 gui 中显示数据工作得很好,国家字符可用等等。只是 IntelliJ 控制台中显示的日志记录输出“关闭”。谢谢。 【参考方案1】:

情况似乎是各种游戏机都没有显示民族字符。那个,以及我实际上必须指定在 ubuntu 命令行上运行的字符集的事实让我相信存在问题,并且实际上在浏览器中而不是在日志控制台中显示数据就表明了这一点。不需要针对特定​​字符集的jackcess“开启者”。

【讨论】:

以上是关于使用 iso-8859-1 在 wildfly 中打开 ucanaccess/jackcess 数据库的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 ISO 8859-1 编码字符

如何使用编码 ISO-8859-1 在 PHP 中编写文件? [复制]

在 Jboss 上使用 ISO-8859-1 编码和 JSF 2

ISO-8859-1 字符在 XSLT 属性中被视为 UTF-8

如何使用 Flex 在 ISO-8859-1 中发送 SOAP 请求?

使用 NSString 将 UTF-8 编码转换为 ISO 8859-1 编码