更改.dbf文件的字符集

时间:2014-06-26 13:42:34

标签: java printing special-characters dbf

我有这个java应用程序,它应该使用.dbf或dBase3文件中的法语特殊字符加载和打印数据,但它不起作用;字符没有显示。

我问this question认为问题只与打印有关,但是如果你看到评论你可以理解我发现问题与数据库有关而不是打印,因为当在我的JTextPane中添加一个特殊字符,它正常打印...我尝试更改textPane的字符集但仍然是同样的问题。

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

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

修改 现在,使用AnswerEthan Furman,我们知道问题与数据库的编码有关,它与普通的旧Ascii有关,而且它与xBaseJ API无关。

现在,问题应该是:是否可以更改dBase数据库的编码?我怎么能这样做?谢谢@Ethan Furman,并提前感谢任何与此问题相关的帮助。

4 个答案:

答案 0 :(得分: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文件夹中:< / p>

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()

答案 1 :(得分:1)

最后,我找到了答案......

首先,如上所述,感谢Ethan Furman,我发现问题与dbf数据库的编码有关,而不是与xBaseJ API有关。

然后我不得不搜索一个工具,可以帮助我改变Ascii数据库的字符集。我发现Apache的OpenOffice可以做到这一点,但问题是我的Windows上没有OpenOffice,我尝试下载5到6次,但每次因为我的互联网连接非常糟糕而中断(它以6到7Kbs的速度下载),而.exe文件是209 mB。因此,我不得不更多地搜索另一个软件来完成所需的任务。而且我不知道我如何发现这个DBF指挥官不仅仅是改变了字符集。无论如何,下载了试用版,它可以执行所有操作,但会显示一个窗口,告诉您每次执行任何操作时都会购买它:D。

最后,我将字符集从Ascii(850国际MS-DOS或其他东西)更改为1252 Windows Ansi ... aaaaand boom!它有效!

我仍然认为术语&#34; codePage&#34;之间存在差异。 &#34;字符集&#34;和&#34;编码&#34;并且我使用它们相同..但至少现在我知道它们存在,这是我学到的新东西。

无论如何,再次感谢Ethan Furman,我也要感谢Google让这成为可能:D!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以尝试使用此库:xbase4j。据我所知,在许多DBF文件中,&#34;语言&#34;标志设置不正确或根本没有设置。要解决此问题,请在打开DBF文件之前指定正确的语言。像这样:

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

如果您需要帮助,请随时与我联系。

此致