有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java更改一个字符集。dbf文件

我有一个java应用程序,它应该从一个。dbf或dBase3文件,但它不工作;角色没有出现

我问this question认为问题只与打印有关,但如果你看到评论,你可以理解,我发现问题与数据库有关,而与打印无关,因为在我的JTextPane中添加特殊字符时,它会正常打印。。。我试着改变文本窗格的字符集,但还是一样的问题

此外,当我使用MS Access打开我的应用程序时,对于那些喜欢解决难题的人来说,这个问题会变得更加复杂。dbf文件,字符就在那里。所以我想,从数据库加载数据时可能会发生错误。。。 顺便说一句,为了获取数据,我使用了这个名为xBaseJ的API,它不使用sql,但它是自己的实现

我希望我已经提供了所有必要的细节,也非常感谢任何帮助,真的。。任何想法都能帮我找到解决方案(以及问题)

编辑 现在,有了Ethan Furman中的Answer,我们知道问题与数据库的编码有关,它是简单的旧Ascii,与xBaseJ API无关

现在,问题应该是:是否可以更改数据库的编码?我该怎么做?谢谢@Ethan Furman,提前感谢您对这个问题的帮助


共 (4) 个答案

  1. # 1 楼答案

    dbf文件都使用编码,而不是utf-8。使用的编码是存储在文件前几个字节中的元数据的一部分。您面临两种情况之一:

    • 编码正确地存储在dbf文件中

      如果发生这种情况,那么MS Acess正确地使用该信息将原始dbf数据解码为unicode,而xBaseJ则不是

    • 编码未正确存储在文件中

      如果发生这种情况,那么MS Access将幸运地猜测编码,而xBaseJ拒绝猜测

    您需要找到一个工具来检查dbf文件,并告诉您其中存储了哪个编码。如果你不知道,也不介意在你的机器上安装Python,你可以使用我写的dbf module来解决这个问题:

    import dbf
    
    table = dbf.Table('/path/to/some_table.dbf')
    print(table)
    

    它将打印出编码、字段数、记录大小、字段名等

    安装注意事项(这可能会很痛苦)

    理想情况下,您应该能够install pip,然后执行pip install enum34 dbf --upgrade,将这两个库的最新版本放在系统的正确位置

    如果做不到这一点,您需要从PyPI中获取enum34dbf,并将enum.pydbf.py放在Python的site-packages文件夹中:

    c:\python27\lib\site-packages  # I think, it's been a while since I used Windows
    

    更新

    如果在完成所有这些之后,您发现文件中从未设置代码页/编码(这种情况发生的频率令人惊讶),那么您也可以使用dbf来更改它(如果您知道应该是什么):

    table.open()
    table.codepage = dbf.CodePage('cp1252') # for example
    table.close()
    
  2. # 2 楼答案

    你可以试试这个库:xbase4j。据我所知,在许多DBF文件中,“语言”标志设置不正确或根本没有设置。要解决这个问题,只需在打开DBF文件之前指定正确的语言即可。比如:

    new XBase().withLanguage(Language.WinANSI).open(new File("..."));
    

    如果你需要帮助,请随时联系我

    问候

  3. # 3 楼答案

    最后,我找到了答案

    首先,正如前面提到的,多亏了Ethan Furman,我发现问题与dbf数据库的编码有关,而不是与xBaseJ API有关

    然后,我不得不花几个小时寻找一个工具,可以帮助我改变数据库的字符集,即Ascii。我发现来自Apache的OpenOffice可以做到这一点,但问题是我的windows上没有OpenOffice,我尝试下载了5到6次,但每次都被中断,因为我的互联网连接非常糟糕(下载速度为6到7Kbs),而且。exe文件是209MB。所以我不得不搜索更多的软件来完成所需的任务。。我不知道我是怎么找到这个DBF指挥官的,它不仅仅是改变字符集。不管怎样,下载的试用版什么都可以,但每次你做任何事情时都会显示一个窗口告诉你去买:D

    最后,我将字符集从Ascii(850国际MS-DOS或其他)更改为1252 Windows Ansi。。。啊,砰!真管用

    我仍然认为“代码页”、“字符集”和“编码”这两个术语之间有区别,我使用的是相同的。。但至少现在我知道它们的存在,这是我学到的新东西

    无论如何,再次感谢伊桑·弗曼,我也要感谢谷歌让这一切成为可能:d

  4. # 4 楼答案

    我可能错了,但请尝试将数据库设置为UTF-8。我猜这个问题与字符编码有关